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

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

El Sanchez 28-03-2013 19:06 2120924

Скрипты Inno Setup. Помощь и советы [часть 6]
 
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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] - Скачать;


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

sergey3695 28-03-2013 19:25 2120935

Как сделать чтобы взависимоти от распаковки через cmd, двигался прогрессбар и отображались проценты? (сторонние библиотеки не нужны, про isdone (ISExec) я знаю)

Gnom_aka_Lexander 28-03-2013 21:21 2121011

El Sanchez,
Цитата:

я про это:
Цитата Gnom_aka_Lexander:
inc(dc); »
почему-же. в полной версии наличиствуют строго эти папки и только эти. и результат будет какой нужен в любом случае, попадется неправильная папка до или после достижения контрольного числа 11. едисвенное, для дополнительных милисекунд можно еще брикнуть на счет 12, и вернуть фальс, ибо дальше можно не искать.
Цитата:

Цитата sergey3695
ерез cmd, двигался прогрессбар и отображались проценты? »

ну.. можно повесить хук на окно консоли и считывать из него текст, наверняка там гдето должны отображаться проценты, либо данные из которых можно вычислить проценты. Так-же можно без этих сложностей с хуками взять другой геморрой - есть гдето функция, с помощью которого можно консольную команду выполнить в мемо (простым языком говоря :) ). Но это помимо гемора еще и вдвое-втрое замедлит процесс выполнения самого приложения, что для пользователя совсем не айс. тут гдето есть реализация распаковки 7-зипа на инно. помимо сомнительности необходимости этой реализации (в инно используется тот-же LZMA-LZMA2 из 7-зипа, все что нужно - открыть справку и настроить, раз хочется именно 7-зиповское сжатие, так это-ж еще и медленно, если учесть для чего используется - для распаковки здоровенных архивов в несколько гигабайт размером. Хотя на размерах в сотню-другую метров 7-зип иногда дает выигрыш, уж не знаю с чем это связано. В общем не мороч себе г7олову, не нужно тебе это. То что ты хочешь - неизбежно дополнительные глюки и тормоза.

habib2302 28-03-2013 21:46 2121035

vint56, и как еще сделать так,чтобы лого работало и в деинсталляторе

saurn 28-03-2013 22:01 2121043

Цитата:

Цитата habib2302
и как еще сделать так,чтобы лого работало и в деинсталляторе »

Ну, так же, только на UninstalProgressForm

Код:

procedure InitializeUninstallProgressForm;
begin
  CreateLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('GLogo.png'), ScaleX(5), ScaleY(325), ScaleX(170), ScaleY(34), True, True);
  ImgApplyChanges(UninstallProgressForm.Handle);

...
И так далее.


habib2302 28-03-2013 22:29 2121068

saurn, лучше дай полностью скипт

saurn 28-03-2013 22:39 2121075

habib2302

Пример

habib2302 28-03-2013 22:53 2121082

Цитата:

Цитата saurn
Inno под рукой нет, чтобы проверить. Проверяйте сами. »

inno есть под рукой и проверил.выдает ошибку при удалении.вот скрин

El Sanchez 28-03-2013 22:54 2121083


Цитата:

Цитата Gnom_aka_Lexander
почему-же. в полной версии наличиствуют строго эти папки и только эти. и результат будет какой нужен в любом случае, попадется неправильная папка до или после достижения контрольного числа 11. едисвенное, для дополнительных милисекунд можно еще брикнуть на счет 12, и вернуть фальс, ибо дальше можно не искать. »

Gnom_aka_Lexander, я про процедуру inc из Delphi. Нет ее в Inno.:wink:

saurn 28-03-2013 23:37 2121119

habib2302, исправил. Архив с примером для инсталятора и деинсталятора прилепил в мой предыдущий пост.

habib2302 29-03-2013 00:06 2121131

saurn, огромное спасибо!!!!!!

Alloc 29-03-2013 16:43 2121591

saurn, Спасибо большое за ответ. Теперь все работает. Не подскажешь, может быть где то можно скачать коллекцию модулей для Inno Setup наподобие Innocallback.dll? Я знаю есть сборка очень хорошая "Inno Ultra", но к сожалению в ней почему то не работают скины... не знаю по какой причине.. хотя в предыдущих версиях помню работало все...

saurn 29-03-2013 17:31 2121624

Alloc
Это не мне спасибо, а Johny777

Так в Innoultra и так собраны все необходимые библиотеки. Строго говоря, там те же самые материалы и программы, которые можно найти на просторах паутины, только собранные вместе и упакованные в инсталятор для удобства.


На счет скинов: я ими не пользуюсь, но думаю вы просто используете не ту версию библиотеки. Оная есть в двух вариантах, для ANSI и UNICODE. Какой у вас компилятор(ANSI/UNICODE) такую же версию библиотеки и надо использовать.

Crazy Noise 29-03-2013 19:53 2121707

Цитата:

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

Благодарю!


А как можно сделать?
Если найдено одно значение а второй нет, то инсталлятор выдал сообщение и не запустился.
Если найден второе а первое нет, тоже выдал сообщение и не запустился.
Если найдены оба значения, то тоже выдал сообщение и не запустился.
Запускался бы лишь в том случае, когда эти значения были другими.

Пробовал добавлять к NetFrameWorkInstalled и MyValueData номера чтоб различались.

потом так

Код:

[*Code]
function InitializeSetup(): Boolean;
var
 NetFrameWorkInstalled, MyResult: Boolean;
 NetFrameWorkInstalled2, MyResult: Boolean;
 MyValueData: Cardinal;
 MyValueData2: Cardinal;

 begin
 begin
  if RegQueryDWordValue(HKLM, 'SOFTWARE\Adobe\Adobe ARM\1.0\ARM', 'iCheckReader', MyValueData) then
  NetFrameWorkInstalled := MyValueData = $00000000;

  if not NetFrameWorkInstalled then
  Result := True else
  MyResult := MsgBox('Найден ключ $00000000', mbConfirmation, MB_OK) = idOk;
end;

begin
  if RegQueryDWordValue(HKLM, 'SOFTWARE\Adobe\Acrobat Reader\11.0\Installer\Optimization', 'iCheckReader', MyValueData2) then
  NetFrameWorkInstalled2 := MyValueData2 = $00000001;

  if not NetFrameWorkInstalled2 then
  Result := True else
  MyResult := MsgBox('Найден ключ $00000001', mbConfirmation, MB_OK) = idOk;
end;
end;


и так

Код:

[*Code]
function InitializeSetup(): Boolean;
var
 NetFrameWorkInstalled, MyResult: Boolean;
 NetFrameWorkInstalled2, MyResult: Boolean;
 MyValueData: Cardinal;
 MyValueData2: Cardinal;

 begin
  if RegQueryDWordValue(HKLM, 'SOFTWARE\Adobe\Adobe ARM\1.0\ARM', 'iCheckReader', MyValueData) then
  NetFrameWorkInstalled := MyValueData = $00000000;

  if not NetFrameWorkInstalled then
  Result := True else
  MyResult := MsgBox('Найден ключ $00000000', mbConfirmation, MB_OK) = idOk;


  if RegQueryDWordValue(HKLM, 'SOFTWARE\Adobe\Acrobat Reader\11.0\Installer\Optimization', 'iCheckReader', MyValueData2) then
  NetFrameWorkInstalled2 := MyValueData2 = $00000001;
 
  if not NetFrameWorkInstalled2 then
  Result := True else
  MyResult := MsgBox('Найден ключ $00000001', mbConfirmation, MB_OK) = idOk;
end;



всё равно не так. Больше идей нет.

Mailchik 29-03-2013 20:58 2121767

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

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

[Code]
function InitializeSetup(): Boolean;
var
 NetFrameWorkInstalled, MyResult: Boolean;
 MyValueData, MyValueData2: Cardinal;
 begin
  if RegQueryDWordValue(HKLM, 'SOFTWARE\Adobe\Adobe ARM\1.0\ARM', 'iCheckReader', MyValueData)
      and RegQueryDWordValue(HKLM, 'SOFTWARE\Adobe\Acrobat Reader\11.0\Installer\Optimization', 'iCheckReader', MyValueData2) then
  NetFrameWorkInstalled := (MyValueData = $00000000) xor (MyValueData2 = $00000001);

  if NetFrameWorkInstalled then
  Result := True else
  MyResult := MsgBox('Найден ключ ' + FloatToStr(MyValueData)
    + ' & ' + FloatToStr(MyValueData2), mbConfirmation, MB_OK) = idOk;
end;


habib2302 29-03-2013 21:42 2121788

я хочу задать несколько вопросов ради интереса и ради пользы.какие есть проверки например как эти not IsWin64, IsWin64 и их описание?

Gnom_aka_Lexander 29-03-2013 21:45 2121792

habib2302, это не проверки. это встроенные функции. справка, раздел встроенные функции, там все с описаниями.
Цитата:

Цитата El Sanchez
я про процедуру inc из Delphi. Нет ее в Inno. »

у меня эта функция там не единственная из расширенной версии инно. ;)

habib2302 29-03-2013 21:59 2121803

Gnom_aka_Lexander, в какой справке?если ты имеешь виду в русской справке,то там такого раздела нету

Gnom_aka_Lexander 29-03-2013 22:08 2121813

habib2302, без разницы. русская отличается только своей русскоязычностью и парой факов, не более. смотреть можно в любой и там и там есть описания всех функций. как встроенных так и внешних. Инно задокументирована на 100%

habib2302 29-03-2013 22:21 2121826

Gnom_aka_Lexander, нашел

Crazy Noise 29-03-2013 23:31 2121886

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

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

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

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

habib2302,

Alloc 30-03-2013 01:25 2121949

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

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

saurn 30-03-2013 02:20 2121960

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;


Alloc 30-03-2013 02:40 2121970

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

#define NeedSize "5059"
, но хотелось бы что б программа сама определяла.. Заранее спасибо.

saurn 30-03-2013 03:22 2121974

Цитата:

Цитата 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;


Johny777 30-03-2013 07:01 2121994

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;


habib2302 30-03-2013 16:19 2122276

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

saurn 30-03-2013 16:22 2122278

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;


Alloc 30-03-2013 20:57 2122470

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

audiofeel 31-03-2013 01:55 2122575

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

saurn 31-03-2013 02:08 2122576

audiofeel

Код:

ParentColor := True;

Crazy Noise 31-03-2013 02:29 2122585

audiofeel, Текст не виден?
Код:

WizardForm.DirEdit.Font.Color := clRed;
WizardForm.DirEdit.ParentColor := True;


saurn 31-03-2013 02:31 2122586

audiofeel, да, щас проверил, на изображении такой способ не прокатывает. Кстати, вот тут вам уже приводили подобный пример: Пост #1586 не оно?

audiofeel 31-03-2013 02:33 2122590

saurn, да спасибо за участие но я его переношу в свой "скрипт" и эффекта нет

Crazy Noise 31-03-2013 02:35 2122591

Вот как вариант
Код:

WizardForm.DirEdit.BorderStyle := bsNone;

saurn 31-03-2013 02:42 2122593

audiofeel, ну этот пример рабочий 100%. Может, что не так делаете? Скрипт можно глянуть?

Crazy Noise 31-03-2013 02:54 2122597

audiofeel, Вместе пробовал использовать?
Код:

    WizardForm.DirEdit.ParentColor := True;
    WizardForm.DirEdit.BorderStyle := bsNone;


audiofeel 31-03-2013 03:04 2122602

Crazy Noise, нет не выходит, все "белое"

saurn 31-03-2013 03:14 2122606

audiofeel, не получалось у вас с этим примером потому, что у вас все элементы находятся на WizardForm, просто надо было указать, где показать лейбл, а где спрятать. И DirEdit спрятать совсем. Вообщем скрипты я объединил, там пометил, где что вставил и изменил. По этому же самому принципу можете сделать и для GroupEdit.

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

#define AppName "BioShock Infinite"

#include "ISDone\ISDone.iss"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
WizardImageFile=style\big.bmp
AppID={{461C5FA1-3CDE-45CA-9255-158B25DBF171}
SetupIconFile=style\app.ico
VersionInfoCompany=Irrational Games
VersionInfoVersion=1.1.21.7860
VersionInfoDescription={#AppName}
VersionInfoCopyright=Copyright 2002-2013 Irrational Games and Take-Two Interactive Software, Inc.
UninstallDisplayName={#AppName}
AppVersion=1.0.1384116
UninstallDisplayIcon={app}\Binaries\Win32\BioShockInfinite.exe
AppSupportURL=http://www.bioshockinfinite.com/ru
AppPublisher=2K Games
AppPublisherURL=http://www.2kgames.com/
AppUpdatesURL=http://www.1csc.ru/games/pc/21611-bioshock-infinite
MinVersion=,6.1.7600
ExtraDiskSpaceRequired=11046539264

[Run]
Filename: {src}\redist\DXSETUP.exe; Tasks: directx; Parameters: /silent; WorkingDir: {src}\redist; StatusMsg: Обновление компонентов библиотеки DirectX

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: directx; Description: Обновление компонентов библиотеки DirectX; GroupDescription: Установка дополнительного програмного обеспечения:; Flags: unchecked

[Icons]
Name: {group}\{cm:UninstallProgram, {#AppName}}; Filename: {uninstallexe}
Name: {group}\{#AppName}; Filename: {app}\Binaries\Win32\BioShockInfinite.exe; WorkingDir: {app}\Binaries\Win32
Name: {commondesktop}\{#AppName}; Filename: {app}\Binaries\Win32\BioShockInfinite.exe; Tasks: desktopicon; WorkingDir: {app}\Binaries\Win32
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Tomb Raider; Filename: {app}\Binaries\Win32\BioShockInfinite.exe; WorkingDir: {app}\Binaries\Win32; Tasks: quicklaunchicon

[Registry]
Root: HKCU; SubKey: Software\Valve\Steam\ActiveProcess; ValueType: string; ValueName: SteamClientDll; ValueData:
Root: HKCU; SubKey: Software\Valve\Steam\ActiveProcess; ValueType: string; ValueName: SteamClientDll64; ValueData:
Root: HKLM; SubKey: SOFTWARE\Valve\Steam; ValueType: string; ValueName: InstallPath; ValueData: {pf}\Steam; Flags: createvalueifdoesntexist

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

[Files]
Source: Slides\*; DestDir: {tmp}; Flags: dontcopy

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

const
  MAX_PATH = 260;
  MAX_PATH_LEN = 55;

type
  TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  TimerID: LongWord;
  CurrentPicture: integer;
  PicList: TStringlist;
  WlcLbl, DirLbl, DirLbl1, DirLbl2, DirLbl3, TasksLbl, TasksLbl1: TLabel;
  DirBvl, DirBvl1, TasksBvl, TasksBvl1: TBevel;
  PathLabel: TLabel;

function PathCompactPathEx(pszOut: String; pszSrc: String; cchMax: UINT; dwFlags: DWORD): BOOL; external 'PathCompactPathEx{#A}@shlwapi.dll stdcall';
function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:ISDone.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';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall';
procedure InitializeSlideShow(Hwnd:Thandle; l,t,w,h:integer;Animate:boolean; Stretch:integer); external 'InitializeSlideShow@files:isslideshow.dll stdcall';
procedure DeinitializeSlideShow; external 'DeinitializeSlideShow@files:isslideshow.dll stdcall';
procedure ShowImage(ipath:PAnsiChar; Effect:integer); external 'ShowImage@files:isslideshow.dll stdcall';



/////////////////////////////////////////////////////////////////////////////////////
function ShortPath(Input: String; Length: Integer): String;
begin
  Result := StringOfChar(#32, MAX_PATH);
  PathCompactPathEx(Result, Input, Length, 0);
end;

procedure DirEditOnChange(Sender: TObject);
begin
  PathLabel.Caption := ShortPath(TEdit(Sender).Text, MAX_PATH_LEN);
end;
////////////////////////////////////////////////////////////////////////////////////



procedure InitializeWizard();
var
  i: integer;
begin
  WizardForm.Position := poScreenCenter;
  WizardForm.ClientWidth := ScaleX(600);
  WizardForm.ClientHeight := ScaleX(366);
  WizardForm.InnerNotebook.Hide;
  WizardForm.OuterNotebook.Hide;

  WizardForm.Bevel.Parent := WizardForm;
  WizardForm.Bevel.Top := ScaleX(313);
  WizardForm.Bevel.Width := ScaleX(600);

  WizardForm.NextButton.SetBounds(420,328,80,26);
  WizardForm.CancelButton.SetBounds(500,328,80,26);
  WizardForm.BackButton.SetBounds(340,328,80,26);

  WizardForm.WizardBitmapImage.Parent := WizardForm;
  WizardForm.WizardBitmapImage.SetBounds(0,0,600,313);

  WizardForm.DirEdit.Parent := WizardForm;
//  WizardForm.DirEdit.AutoSelect := False;
//  WizardForm.DirEdit.ParentColor := True; //Color := clBlack;
//  WizardForm.DirEdit.Font.Color := clWhite;
  WizardForm.DirEdit.SetBounds(20,142,325,21);
  WizardForm.DirEdit.OnChange := @DirEditOnChange;
  WizardForm.DirEdit.Hide;

  WizardForm.GroupEdit.Parent := WizardForm;
  WizardForm.GroupEdit.AutoSelect := False;
  WizardForm.GroupEdit.Color := clBlack;
  WizardForm.GroupEdit.Font.Color := clWhite;
  WizardForm.GroupEdit.SetBounds(20,222,325,21);

  WizardForm.DirBrowseButton.Parent := WizardForm;
  WizardForm.DirBrowseButton.SetBounds(350,141,80,23);
  WizardForm.DirBrowseButton.Caption := 'Изменить';

  WizardForm.GroupBrowseButton.Parent := WizardForm;
  WizardForm.GroupBrowseButton.SetBounds(350,221,80,23);
  WizardForm.GroupBrowseButton.Caption := 'Изменить';

  WizardForm.TasksList.Parent := WizardForm;
  WizardForm.TasksList.ParentColor := True; //clBlack;
  WizardForm.TasksList.Font.Color := clWhite;
  WizardForm.TasksList.SetBounds(36,110,295,150);

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Font.Name  := 'Arial';
  WizardForm.StatusLabel.Font.Height := -12;
  WizardForm.StatusLabel.Font.Style  := [fsBold];
  WizardForm.StatusLabel.SetBounds(20,314,450,14);

  WlcLbl := TLabel.Create(WizardForm);
  With WlcLbl do begin
    Parent      := WizardForm;
    Transparent := True;
    WordWrap    := True;
    Font.Name  := 'Arial';
    Font.Color  := clWhite;
    Font.Height := -13;
    Font.Style  := [fsBold];
    Caption    := 'Вас приветствует Мастер установки {#AppName}' + #13#10#13#10#13#10 + 'Программа установит {#AppName} на Ваш компьютер. Рекомендуется закрыть все прочие приложения и отключить антивирусное программное обеспечение перед тем, как продолжить.' + #13#10#13#10#13#10 + 'Нажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.';
    SetBounds(20,106,390,176);
  end;

  DirLbl := TLabel.Create(WizardForm);
  With DirLbl do begin
    Parent      := WizardForm;
    Transparent := True;
    WordWrap    := True;
    Font.Name  := 'Arial';
    Font.Color  := clWhite;
    Font.Height := -12;
    Font.Style  := [fsBold];
    Caption    := 'Требуется как минимум наличие 10.2 Гб свободного дискового пространства.';
    SetBounds(15,275,385,30);
  end;

  DirLbl1 := TLabel.Create(WizardForm);
  With DirLbl1 do begin
    Parent      := WizardForm;
    Transparent := True;
    WordWrap    := True;
    Font.Name  := 'Arial';
    Font.Color  := clWhite;
    Font.Height := -12;
    Font.Style  := [fsBold];
    Caption    := 'Папка в меню «Пуск»';
    SetBounds(35,200,135,20);
  end;

  DirLbl2 := TLabel.Create(WizardForm);
  With DirLbl2 do begin
    Parent      := WizardForm;
    Transparent := True;
    WordWrap    := True;
    Font.Name  := 'Arial';
    Font.Color  := clWhite;
    Font.Height := -12;
    Font.Style  := [fsBold];
    Caption    := 'Путь установки';
    SetBounds(35,120,90,20);
  end;

  DirLbl3 := TLabel.Create(WizardForm);
  With DirLbl3 do begin
    Parent      := WizardForm;
    Transparent := True;
    WordWrap    := True;
    Font.Name  := 'Arial';
    Font.Color  := clWhite;
    Font.Height := -12;
    Font.Style  := [fsBold];
    Caption    := 'Выбор параметров установки. Если Вы хотите выбрать другую папку, нажмите «Изменить». Нажмите «Далее», чтобы продолжить';
    SetBounds(15,65,365,45);
  end;

  TasksLbl := TLabel.Create(WizardForm);
  With TasksLbl do begin
    Parent      := WizardForm;
    Transparent := True;
    WordWrap    := True;
    Font.Name  := 'Arial';
    Font.Color  := clWhite;
    Font.Height := -12;
    Font.Style  := [fsBold];
    Caption    := 'Выбор компонентов';
    SetBounds(30,72,120,20);
  end;

  TasksLbl1 := TLabel.Create(WizardForm);
  With TasksLbl1 do begin
    Parent      := WizardForm;
    Transparent := True;
    WordWrap    := True;
    Font.Name  := 'Arial';
    Font.Color  := clWhite;
    Font.Height := -12;
    Font.Style  := [fsBold];
    Caption    := 'Когда Вы будете готовы приступить к установке нажмите «Установить»';
    SetBounds(30,272,290,30);
  end;

  DirBvl := TBevel.Create(WizardForm);
  with DirBvl do
  begin
    Parent := WizardForm;
    Style  := bsFrame;
    SetBounds(10,115,430,75);
  end;

  DirBvl1 := TBevel.Create(WizardForm);
  with DirBvl1 do
  begin
    Parent := WizardForm;
    Style  := bsFrame;
    SetBounds(10,195,430,75);
  end;

  TasksBvl := TBevel.Create(WizardForm);
  with TasksBvl do
  begin
    Parent := WizardForm;
    Style  := bsFrame;
    SetBounds(10,65,430,240);
  end;

  TasksBvl1 := TBevel.Create(WizardForm);
  with TasksBvl1 do
  begin
    Parent := WizardForm;
    Style  := bsFrame;
    SetBounds(25,95,400,175);
  end;

  PicList := TStringlist.Create;
    for i:= 1 to 30 do begin
      ExtractTemporaryFile(IntToStr(i)+'.jpg');
      piclist.add(ExpandConstant('{tmp}\') + IntToStr(i)+'.jpg');
    end;


//////////////////////////////////////////////////////////////////////////////////////////////////////
  PathLabel := TLabel.Create(WizardForm)
  with PathLabel do
  begin
    Parent := WizardForm;
    Caption := ShortPath(WizardForm.DirEdit.Text, MAX_PATH_LEN);
    Transparent := True;
    Font.Size := 9;
    Font.Color := clWhite;
    Font.Style := [fsBold];
    Left := WizardForm.DirEdit.Left;
    Top := WizardForm.DirEdit.Top + Round((WizardForm.DirEdit.Height - Height) div 2);
  end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
 
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
 CurrentPicture := CurrentPicture+1;
 if CurrentPicture = piclist.count+1 then CurrentPicture := 1;
 ShowImage(piclist.strings[CurrentPicture - 1], 1);
end;

Procedure HideComponents();
begin
  WizardForm.WizardBitmapImage.Hide;
  WizardForm.GroupEdit.Hide;
  WizardForm.DirBrowseButton.Hide;
  WizardForm.GroupBrowseButton.Hide;
  WizardForm.TasksList.Hide;
  WizardForm.StatusLabel.Hide;
  WlcLbl.Hide;
  DirLbl.Hide;
  DirLbl1.Hide;
  DirLbl2.Hide;
  DirLbl3.Hide;
  DirBvl.Hide;
  DirBvl1.Hide;
  TasksBvl.Hide;
  TasksBvl1.Hide;
  TasksLbl.Hide;
  TasksLbl1.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then begin
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    CreateControls;
    WizardForm.StatusLabel.Caption := 'Распаковка файлов...';
    ISDoneCancel:=0;
    ExtractTemporaryFile('unarc.dll');
    ExtractTemporaryFile('CLS-precomp.dll');
    ExtractTemporaryFile('packjpg_dll.dll');
    ExtractTemporaryFile('packjpg_dll1.dll');
    ExtractTemporaryFile('precomp.exe');
    ExtractTemporaryFile('zlib1.dll');
    ExtractTemporaryFile('CLS-srep.dll');
    ExtractTemporaryFile('facompress.dll');
    #ifdef records
    ExtractTemporaryFile('records.inf');
    #endif
    ExtractTemporaryFile('russian.ini');
    #ifdef precomp
      PCFVer:={#precomp};
    #else
      PCFVer:=0;
    #endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, 0,0,0, MainForm.Handle, 0, @ProgressCallback) then begin
      repeat
        if not SrepInit  (ExpandConstant('{app}\'),512,0) then break;
        if not PrecompInit(ExpandConstant('{app}\'),128,0) then break;
        if not FileSearchInit(false) then break;
        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data2.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data3.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data4.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
        if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'data5.bin') then break;
        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data5.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) 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 CurPageChanged(CurPageID: integer);
begin
  PathLabel.Hide;/// Здесь: лейбл скрывается
  if CurPageID = wpWelcome then begin
    HideComponents;
    WizardForm.WizardBitmapImage.Show;
    WlcLbl.Show;
  end;

  if CurPageID = wpSelectDir then begin
    HideComponents;
    WizardForm.WizardBitmapImage.Show;
    PathLabel.Show;/// здесь: показывается только на странице выбора папок
    WizardForm.GroupEdit.Show;
    WizardForm.DirBrowseButton.Show;
    WizardForm.GroupBrowseButton.Show;
    DirBvl.Show;
    DirBvl1.Show;
    DirLbl.Show;
    DirLbl1.Show;
    DirLbl2.Show;
    DirLbl3.Show;
  end;

  if CurPageID = wpSelectTasks then begin
    HideComponents;
    WizardForm.WizardBitmapImage.Show;
    WizardForm.TasksList.Show;
    WizardForm.NextButton.Caption := 'Установить';
    TasksBvl.Show;
    TasksBvl1.Show;
    TasksLbl.Show;
    TasksLbl1.Show;
  end;

  if CurPageID = wpInstalling then begin
    InitializeSlideShow(WizardForm.Handle, 0, 0, scaleX(600), ScaleY(313), true, 2);
    CurrentPicture := 1;
    ShowImage(piclist.strings[CurrentPicture-1], 1);
    TimerID := SetTimer(0, 0, 10000, WrapTimerProc(@OnTimer, 4));
    HideComponents;
    WizardForm.WizardBitmapImage.Show;
    WizardForm.StatusLabel.Show;
  end;

  if CurPageID = wpFinished then begin
    DeinitializeSlideShow;
    KillTimer(0, TimerID);
    HideComponents;
    WizardForm.WizardBitmapImage.Show;
    WlcLbl.Show;
    WlcLbl.Caption := 'Завершение Мастера установки {#AppName}' + #13#10#13#10#13#10 + 'Игра {#AppName} установлена на ваш компьютер. Приложение можно запустить с помощью соответствующего значка.' + #13#10#13#10#13#10 + 'Нажмите «Завершить», чтобы выйти из программы установки.';
  end;

  if (CurPageID = wpFinished) and ISDoneError then
  begin
    WizardForm.Caption := 'Ошибка распаковки!';
    WlcLbl.Font.Color := clRed;
    WlcLbl.Caption := SetupMessage(msgSetupAborted) ;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID=wpSelectProgramGroup) or (PageID=wpReady) or (PageID=wpSelectComponents) then Result := true;
end;

procedure DeinitializeSetup();
begin
  DeinitializeSlideShow;
  KillTimer(0, TimerID);
end;


audiofeel 31-03-2013 03:38 2122612

saurn, скажи те вот а чтобы оное обвести (рамка) придется бевел создавать, или как то по "проще" - и ещё как мне быть с таск лист, он тоже не "красивый" = "делать" чек боксы" или ... - по другому нельзя?

saurn 31-03-2013 03:55 2122615

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

alert30 31-03-2013 08:15 2122636

saurn, в тегах кода скрипта используй [Code] начальная жирная квадратная скобка и не будет конфликты с тегом и прочих символов перед словом Code.

ABBAT 31-03-2013 10:48 2122680

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

Crazy Noise 31-03-2013 13:32 2122754

Цитата:

Цитата audiofeel
saurn, скажи те вот а чтобы оное обвести (рамка) придется бевел создавать »

Вот на скорую руку накидал:
Код:

[*Code]
var
  GroupBox_DirPage: TNewGroupBox;

procedure InitializeWizard();
begin
    GroupBox_DirPage := TNewGroupBox.Create(WizardForm);
    GroupBox_DirPage.Parent := WizardForm.SelectDirPage;
    GroupBox_DirPage.Left := ScaleX(0);
    GroupBox_DirPage.Top := ScaleY(0);
    GroupBox_DirPage.Width := ScaleX(416);
    GroupBox_DirPage. Height := ScaleY(140);
    GroupBox_DirPage.Caption := 'Папка установки';

    WizardForm.SelectDirBitmapImage.Left := ScaleX(10);
    WizardForm.SelectDirBitmapImage.Top := ScaleY(20);
    WizardForm.SelectDirBitmapImage.Parent := GroupBox_DirPage;

    WizardForm.SelectDirLabel.Left := ScaleX(54);
    WizardForm.SelectDirLabel.Top := ScaleY(20);
    WizardForm.SelectDirLabel.Width := ScaleX(300);
    WizardForm.SelectDirLabel.Parent := GroupBox_DirPage;

    WizardForm.SelectDirBrowseLabel.Left := ScaleX(10);
    WizardForm.SelectDirBrowseLabel.Top := ScaleY(54);
    WizardForm.SelectDirBrowseLabel.Width := ScaleX(405);
    WizardForm.SelectDirBrowseLabel.Parent := GroupBox_DirPage;

    WizardForm.DirEdit.Left := ScaleX(10);
    WizardForm.DirEdit.Top := ScaleY(87);
    WizardForm.DirEdit.Width := ScaleX(317);
    WizardForm.DirEdit.Parent := GroupBox_DirPage;

    WizardForm.DirBrowseButton.Left := ScaleX(332);
    WizardForm.DirBrowseButton.Top := ScaleY(86);
    WizardForm.DirBrowseButton.Parent := GroupBox_DirPage;

    WizardForm.DiskSpaceLabel.Left := ScaleX(10);
    WizardForm.DiskSpaceLabel.Top := ScaleY(116);
    WizardForm.DiskSpaceLabel.Width := ScaleX(405);
    WizardForm.DiskSpaceLabel.Parent := GroupBox_DirPage;
end;


Lex_from_Belarus 31-03-2013 14:23 2122777

Подскажите пожалуйста как лучше организовать инсталлер:

имеется 3 вида компонентов:

компоненты №1 - это компоненты, которые не много занимают места и часто обновляются;
компоненты №2 - это компоненты, которые много занимают и редко обновляются;
компоненты №3 - это компоненты, которые не сильно много места, но больше чем компоненты №1 и не обновляются вообще, ну т.е. устанавливаются только 1 раз в принципе.

Из этого следует, что рационально бы их все устанавливать раздельно, т.е. сделать 3 разных инсталла и обновлять по отдельности, но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов, т.е. глубо говоря структура была бы такой:
Install.exe - сам установщик
xxx1.xxx - файл с компонентами №1
xxx2.xxx - файл с компонентами №2
xxx3.xxx - файл с компонентами №3

и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?

neorom 31-03-2013 21:23 2123085

habib2302 спасибо за скрипт dead-space-2-fenixx-ot-vasyakrn.7z . Именно єто я искал !!!

Johny777 01-04-2013 03:30 2123218

ABBAT,
Цитата:

Цитата ABBAT
Нужно внести ключ в реестр в зависимости от разрешения экрана, если FullHD и выше то ключ один, если ниже то ключ другой. »

используй методы Width и Height класса TScreen
пример только через код:
читать дальше »
Код:

procedure InitializeWizard();
begin
  if (Screen.Width >= 1920) and (Screen.Height >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
  else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
end;


или так, если используешь секцию [Registry]:
читать дальше »
Код:

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

[Registry]
// будет внесён если не фулл хд
Root: HKCU; Subkey: "Software\Valve"; ValueType: String; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: not FullHD_or_Higher();

// будет внесён если фулл хд или выше
Root: HKLM; Subkey: "SOFTWARE\Bethesda Softworks\Skyrim"; ValueName: "Installed Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: FullHD_or_Higher();

[code]
function FullHD_or_Higher(): Boolean;
begin
  Result := (Screen.Width >= 1920) and (Screen.Height >= 1080);
end;



можно и через функцию WinApi GetDeviceCaps(...)
пример:
читать дальше »
Код:

const
  HORZRES      = 8;    // Horizontal width in pixels
  VERTRES      = 10;    // Vertical height in pixels
 
type
  HDC = LongWord;

 
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function GetDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';


procedure InitializeWizard();
var
  uHDC: HDC;
begin
  uHDC := GetDC(0);
  try
    if (GetDeviceCaps(uHDC, HORZRES) >= 1920) and (GetDeviceCaps(uHDC, VERTRES) >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
    else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
  finally
    ReleaseDC(0, uHDC);
  end;
end;



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

saurn,
Цитата:

Цитата saurn
по этому самому принципу можно извлечь кол-во необходимого места и из WizardForm.DiskSpaceLabel. Если нет компонентов в инстале.
Так верно? »

молоток, всё верно! :)

saurn,

Цитата:

Цитата saurn

касательно процентов установки вот тебе пример лучше
у того примера 2 минуса
1. использование необязательной в расширенной версии инно библиотеки innocallback.dll для получения адреса процедуры...
2. использование таймера у которого по умолчанию задержка + он стоит в очередях и задержка может усилиться

для себя уже сделал другой пример, но ещё не выкладывал
принцип такой:
прогрессбар является наследником TWinControl или другим словом он окно, а значит для него действует стандартная оконная функция винды (http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx) ,
как и для всех остальных окон (форма, статик текст и прочие наследники)
но в инно мы к ней по дефоту доступа не имеем и поэтому установим ему свою такую же функцию
дело в том что окно получает сообщения и поле того как оно пройдёт (если пройдёт, тк мы если можем их получать можем и обнулять и прочее) будет выполнен код для этого сообщения (закрыть окно, свернуть, отрисовать нажатие кнопки...) и прогрессбар каждый раз перед отрисовкой новой позиции получает сообщение PBM_SETPOS и именно в этот момент мы можем обновлять проценты перед тем как сообщение пойдёт дальше
пример:

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

Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

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

const
  WM_USER                = $0400;
  CCM_FIRST              = $2000;
  CCM_SETBKCOLOR          = CCM_FIRST + 1;
 
  PBS_SMOOTH              = 01;
  PBS_VERTICAL            = 04;
  PBM_SETRANGE            = WM_USER+1;
  PBM_SETPOS              = WM_USER+2;
  PBM_DELTAPOS            = WM_USER+3;
  PBM_SETSTEP            = WM_USER+4;
  PBM_STEPIT              = WM_USER+5;
  PBM_SETRANGE32          = WM_USER+6;  // lParam = high, wParam = low
  PBM_GETRANGE            = WM_USER+7;  // lParam = PPBRange or Nil
                                        // wParam = False: Result = high
                                        // wParam = True: Result = low
  PBM_GETPOS              = WM_USER+8;
  PBM_SETBARCOLOR        = WM_USER+9;                // lParam = bar color
  PBM_SETBKCOLOR          = CCM_SETBKCOLOR;  // lParam = bkColor

  { For Windows >= XP }
  PBS_MARQUEE            = $08;
  PBM_SETMARQUEE          = WM_USER+10;

  { For Windows >= Vista }
  PBS_SMOOTHREVERSE      = $10;

  { For Windows >= Vista }
  PBM_GETSTEP            = WM_USER+13;
  PBM_GETBKCOLOR          = WM_USER+14;
  PBM_GETBARCOLOR        = WM_USER+15;
  PBM_SETSTATE            = WM_USER+16;  { wParam = PBST_[State] (NORMAL, ERROR, PAUSED) }
  PBM_GETSTATE            = WM_USER+17;

  { For Windows >= Vista }
  PBST_NORMAL            = $0001;
  PBST_ERROR              = $0002;
  PBST_PAUSED            = $0003;




  GWL_WNDPROC = -4;


type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
   

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';

var
  OldProgressBarProc: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if Msg =  PBM_SETPOS then with WizardForm.ProgressGauge do WizardForm.Caption := FormatFloat('0.#0 %', (Position*100)/Max);

  Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;



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

Lex_from_Belarus,
Цитата:

Цитата Lex_from_Belarus
но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов »

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

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

Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra


[Components]
Name: A; Description: The Elder Scrolls V - Skyrim; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed; Check: InExternalTextFile('The Elder Scrolls V - Skyrim');
Name: B; Description: на английском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на английском языке');
Name: C; Description: на русском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на русском языке');

Name: FF; Description: Visual C++ 2010 (x86) (необходим для запуска приложения); Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('Visual C++ 2010 (x86) (необходим для запуска приложения)');
Name: HL; Description: DirectX; Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('DirectX');




[Code]
//var
//  Buff: array of String;
//
//function InExternalTextFile(const SearchName: String): Boolean;
//var
//  i: Integer;
//begin
//  if GetArrayLength(Buff) = 0 then if LoadStringsFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff) then
//  for i := 0 to GetArrayLength(Buff)-1 do
//  begin
//    Result := Buff[i] = SearchName;
//    if Result then Break;
//  end;
//end;


var
  Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
  if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
  Result := Pos(SearchName, Buff) > 0;
end;


для этого примера положи рядом с экзешником инсталла текстовый файл Install.txt содержащий:
The Elder Scrolls V - Skyrim
на английском языке
на русском языке

nik1967 01-04-2013 08:37 2123247

Lex_from_Belarus, а я сделал сложнее (наверное, хотя для меня этот вариант проще). В зависимости от нахождения файла рядом (ну или ещё где - путь задаётся в шапке скрипта) с инсталлятором будет отображаться компонент (ну или не будет). If components exist
Цитата:

и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?
Воспользуйся паролем на архив при сжатии.

ABBAT 01-04-2013 09:19 2123259

Johny777, Большое спасибо дружище за примеры (GetDeviceCaps по моему более элегантна)
Ещё вопрос, можно убрать иконку инсталятора с панели задач (не критично просто интересно кто нибудь слышал о током)

Crazy Noise 01-04-2013 10:22 2123280

alert30, Можно и проще.
Посто скопировать в редакторе как UBB-код


получется вот так

Код:

[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

[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:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent


alert30 01-04-2013 12:37 2123369

Crazy Noise, я говорю о секциях [code], о копировании через UBB уже и так давно знаю (это уже не по теме).
А у Вас секция [code] нету.

Лучше Всем расскажу:
Неудобно было так:
[code]
Код:

begin
end.




Lex_from_Belarus 01-04-2013 15:09 2123520

Цитата:

Цитата Johny777
можно конечно, только сделал проще - не три разных файла с компонентами а один в котором столбиком(обязательно для первой функции, которая закоментирована) или просто перечислены компоненты, те если имя компонента есть в файле, то он будет добален в чеклистбокс, если нет то пропущен
вот пример из двух функций (вторая, которая не закомментирована работает быстрее, но в познавательных целях оставил первую (у меня какая-то странная тяга к массивам и первая на их основе )) »

так тут смысл в том, чтобы уменьшить скачиваемый инсталл с наиболее частыми обновляемыми файлами.

Crazy Noise 01-04-2013 15:57 2123578

alert30, Вижу не часто попадалось.
читать дальше »
При применении BB таким образом, очень легко ошибиться и не заметить
Код:

[]Code]
var
  Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
  if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
  Result := Pos(SearchName, Buff) > 0;
end;

Цитата:

Цитата alert30
А у Вас секция [code] нету. »

Смысл и так понятен, там не только код но и весь скрипт.


Кто-то запрещает использовать [HTML][/HTML] или [PHP][/PHP]?

HTML код:

[code]
var
  Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
  if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
  Result := Pos(SearchName, Buff) > 0;
end;

PHP код:

[code]
var
  
BuffString;

function 
InExternalTextFile(const SearchNameString): Boolean;
begin
  
if Buff '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt'Buff);
  
Result := Pos(SearchNameBuff) > 0;
end

И ничего не нужно подставлять или изобретать!

Lex_from_Belarus 01-04-2013 16:14 2123603

Цитата:

Цитата nik1967
Lex_from_Belarus, а я сделал сложнее (наверное, хотя для меня этот вариант проще). В зависимости от нахождения файла рядом (ну или ещё где - путь задаётся в шапке скрипта) с инсталлятором будет отображаться компонент (ну или не будет). If components exist
Цитата:
и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?
Воспользуйся паролем на архив при сжатии. »

что-то я наверное туплю наверное, но в каждом архиве находится от 2 до 30 компонетов и наверное этот метод не прокатит?

alert30 01-04-2013 16:20 2123611

Crazy Noise, ну это Ваше дело. Тег [code] и его закрытия тега я привык вставлять.

habib2302 01-04-2013 19:41 2123827

Доброе время суток.Как сделаль (добавить) в инсталлятор и деинсталлятор Wizard Small Image и Wizard Image без фона?

Johny777 02-04-2013 20:09 2124480

habib2302,
Цитата:

Цитата habib2302
.Как сделаль (добавить) в инсталлятор и деинсталлятор Wizard Small Image и Wizard Image без фона? »

Использовать ботву (botva2.dll от South) для прозрачных картинок, но тк тебе ещё и для деинсталятора, то проще всего запихать картинки и библиотеку в ресурсы (в экзешник) и грузить оттуда
Важно: в соглашении вызова импортируемых из библы функциий указать delayload (вроде как стоит по дефолту)

код(целых 87 строк :) ):
читать дальше »
Код:

#include "botva2.iss"
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[Code]
const
   
AXEL_YELLOW = $48c1ca;
    RT_RCDATA = 10;


function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
   
lResStream: TResourceStream;
begin
   
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
    try
       
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
    finally
       
lResStream.Free;
        Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
    end;
end;


procedure InitializeWizard;
var
   
bPicHandle, bPicHandle2, lPicHandle: THandle;
begin
    with
WizardForm do
    begin
       
WelcomePage.Color := AXEL_YELLOW;
        MainPanel.Color := AXEL_YELLOW;

        if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
        begin
           
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
            WizardBitmapImage.Hide;
            ImgSetVisibility(bPicHandle, True);
            ImgApplyChanges(WelcomePage.Handle);
           
            bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
            WizardBitmapImage2.Hide;
            ImgSetVisibility(bPicHandle, True);
            ImgApplyChanges(FinishedPage.Handle);
           
            lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(lPicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;

procedure DeinitializeSetup();
begin
    if
FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
   
lPicHandle: THandle;
begin
    with
UninstallProgressForm do
    begin
       
MainPanel.Color := AXEL_YELLOW;
   
        if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
        begin
           
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(lPicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;

procedure DeinitializeUninstall();
begin
    if
FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;



скрин:


архив с примером и со всем необходимым:
http://sendfile.su/788305

PS: для себя я бы не выносил загрузку ресурсов в функцию function GetFromRes(const ResName, SaveFileName: String): Boolean; с точки зрения оптимизации скорости работы
но думаю так будет проще понять что к чему. Потом поменяешь, если захочешь!

Gnom_aka_Lexander 02-04-2013 20:28 2124491

Цитата:

Цитата Johny777
для себя я бы не выносил загрузку ресурсов в функцию function GetFromRes(const ResName, SaveFileName: String): Boolean; с точки зрения оптимизации скорости работы »

наоборот. несколько мелких функций гораздо оптимальнее одного здоровенного уродливого монстра. единственное, для дополнительной оптимизации есь смысл передавать TStrings со списком ресурсов , дабы не создавать для каждого ресурса отдельный объект TResourceStream. Создали и в цикле по списку выгружаем на диск, с очисткой после выгрузки. Это точно будет быстрее, чем столько-же раз создать и разрушить объект.

habib2302 02-04-2013 21:14 2124523

Johny777, а почему в скрипте указанно 3 изображения?

Gnom_aka_Lexander 02-04-2013 21:45 2124543

habib2302, потому, что изображения на первой и на последней страницах - это разные объекты. плюс смалл имидж - 3 ведь получается?

habib2302 02-04-2013 22:05 2124552

Gnom_aka_Lexander, я так и думал!

insombia 02-04-2013 22:20 2124562

Johny777 а как в твоем примере растянуть картинку на весь инсталл? как фоновой так и маленькой

habib2302 02-04-2013 23:31 2124610

люди.подскажите как убрать combo box в страници компонентов?

vint56 03-04-2013 00:36 2124638

habib2302 WizardForm.TypesCombo.hide;

habib2302 03-04-2013 00:50 2124649

помогите мне объеденить этот скрипт с моим

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

#include "botva2.iss"
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[........Code]
const
    AXEL_YELLOW = $48c1ca;
    RT_RCDATA = 10;


function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
    lResStream: TResourceStream;
begin
    lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
    try
        lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
    finally
        lResStream.Free;
        Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
    end;
end;


procedure InitializeWizard;
var
    bPicHandle, bPicHandle2, lPicHandle: THandle;
begin
    with WizardForm do
    begin
        WelcomePage.Color := AXEL_YELLOW;
        MainPanel.Color := AXEL_YELLOW;

        if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
        begin
            bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
            WizardBitmapImage.Hide;
            ImgSetVisibility(bPicHandle, True);
            ImgApplyChanges(WelcomePage.Handle);
           
            bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
            WizardBitmapImage2.Hide;
            ImgSetVisibility(bPicHandle, True);
            ImgApplyChanges(FinishedPage.Handle);
           
            lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(lPicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;

procedure DeinitializeSetup();
begin
    if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
    lPicHandle: THandle;
begin
    with UninstallProgressForm do
    begin
        MainPanel.Color := AXEL_YELLOW;
   
        if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
        begin
            lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(lPicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;


saurn 03-04-2013 01:56 2124671

habib2302

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

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"

#define AuthRep "Xabib"

#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile={tmp}\ico.ico
Compression=lzma2/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

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

[Components]
Name: AIDA64; Description: AIDA64; Types: full;
Name: AIDA64\AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA64\AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора
;Source: logo.png;  Flags: dontcopy;
;Source: botva2.dll; Flags: dontcopy;
;Source: b2p.dll; Flags: dontcopy;
;Source: botva2.dll; DestDir:{app}
;Source: b2p.dll; DestDir:{app}
;Source: logo.png; DestDir: {app};
Source: WinTB.dll; Flags: dontcopy;
Source: {tmp}\ico.ico; DestDir: {app}; Flags: ignoreversion
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Dirs]
Name: {app}\{#AIDA641}; Components: AIDA64\AIDA641;
Name: {app}\{#AIDA642}; Components: AIDA64\AIDA642;

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Components: AIDA64\AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Components: AIDA64\AIDA642;
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe};
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA64\AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA64\AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA642;

[Run]
Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA641;
Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

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

[Code]
const
  AXEL_YELLOW = $48c1ca;
  RT_RCDATA = 10;

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
 
function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
  finally
    lResStream.Free;
    Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
  end;
end;

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

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

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
  Result:=True;
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    WelcomePage.Color := AXEL_YELLOW;
    MainPanel.Color := AXEL_YELLOW;

    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);
     
      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;
   
    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
   
    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(nil);
    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;
 
    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;
 
procedure DeinitializeSetup();
begin
  gdipShutdown;
  TaskBarDestroy;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      MainPanel.Color := AXEL_YELLOW;
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);
       
        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;


vint56 03-04-2013 02:19 2124673

habib2302
читать дальше »
#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"

#define AuthRep "Xabib"
#include "botva2.iss"
[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile={tmp}\ico.ico
Compression=lzma2/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LgPic:Logo.png|LiPic:LiPic.png|aPic:aPic.png

[Files]
Source: WinTB.dll; Flags: dontcopy;
Source: {tmp}\ico.ico; DestDir: {app}; Flags: ignoreversion
;Source: botva2.dll; Flags: dontcopy
;Source: bPic.png; Flags: dontcopy

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

[Components]
Name: AIDA64; Description: AIDA64; Types: full;
Name: AIDA64\AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA64\AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;


[Dirs]
Name: {app}\{#AIDA641}; Components: AIDA64\AIDA641;
Name: {app}\{#AIDA642}; Components: AIDA64\AIDA642;

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Components: AIDA64\AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Components: AIDA64\AIDA642;
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe};
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA64\AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA64\AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA642;

[Run]
Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA641;
Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

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


[code]
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;


var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;

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

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

#include "WinTB.iss"

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;


function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
Result:=True;
end;


procedure InitializeWizard;
var
bPicHandle, bPicHandle2, lPicHandle,LGPicHandle: THandle;
begin
with WizardForm do
begin
WizardForm.TypesCombo.hide;
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;
ExtractTemporaryFile('WinTB.dll');
SetTaskBarProgressValue(0, 60);
SetTaskBarProgressState(0, TBPF_ERROR);
TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
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;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LGPIC', 'Logo.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
begin
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

lGPicHandle := ImgLoad(WizardForm.handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgSetVisibility(LGPicHandle, True);
ImgApplyChanges(Wizardform.Handle);

bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;

procedure DeinitializeSetup;
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
TaskBarDestroy;
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
lPicHandle,lGPicHandle: THandle;
begin
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_LIPIC', 'LIPic.png') and GetFromRes('_IS_LGPIC', 'Logo.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

lGPicHandle := ImgLoad(UninstallProgressForm.handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgSetVisibility(LGPicHandle, True);
ImgApplyChanges(UninstallProgressForm.Handle);
end;
end;
end;

procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;

saurn 03-04-2013 02:38 2124680

habib2302, только что скомпилировал - ошибок нет. Ресурсы botva2.dll, b2p.dll, logo.png, bPic.png, LiPic.png, aPic.png должны находится рядом со скриптом.

Johny777 03-04-2013 02:42 2124681

Gnom_aka_Lexander,
Цитата:

Цитата Gnom_aka_Lexander
наоборот. несколько мелких функций гораздо оптимальнее одного здоровенного уродливого монстра. единственное, для дополнительной оптимизации есь смысл передавать TStrings со списком ресурсов , дабы не создавать для каждого ресурса отдельный объект TResourceStream. Создали и в цикле по списку выгружаем на диск, с очисткой после выгрузки. Это точно будет быстрее, чем столько-же раз создать и разрушить объект. »

В натуре. Цикл действительно ускорил скорость запуска, что видно на глаз по появлению кнопки в панели задач - теперь без тормозка.
в цикле создаём массив of TResourceStream, и сразу же извлекаем файл и разрушаем TResourceStream-ы и входной стринглист
Короче зацени function ExtractResource(var ResourceList: TStringList): Boolean; чуть ниже под спойлером! :)
habib2302, vint56, saurn, вот обновлённый пример, он совместим с файлами из архива в моём предыдущем посте:
читать дальше »
Код:

#include "botva2.iss"

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[Code]
const
   
AXEL_YELLOW = $48c1ca;
    RT_RCDATA = 10;
   

function ExtractResource(var ResourceList: TStringList): Boolean;
var
   
ResStreams: array of TResourceStream;
    ResName, ResFile: String;
    i: Integer;
begin
    if
ResourceList = nil then Exit;
    Result := ResourceList.Count > 0;
    SetArrayLength(ResStreams, ResourceList.Count);
    try
        for
i := 0 to ResourceList.Count-1 do
        try
           
ResName := Trim( Copy(ResourceList.Strings[i], 1, Pos(',', ResourceList.Strings[i])-1) );
            ResFile := Trim( Copy(ResourceList.Strings[i], Pos(',', ResourceList.Strings[i])+1, Length(ResourceList.Strings[i])-Pos(',', ResourceList.Strings[i])) );
            ResStreams[i] := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
            ResStreams[i].SaveToFile(ExpandConstant('{tmp}\') + ResFile);
            Result := Result and FileExists(ExpandConstant('{tmp}\') + ResFile);
        finally
           
ResStreams[i].Free;
        end;
    finally
       
ResourceList.Free;
    end;
end;


procedure InitializeWizard;
var
   
PicHandle: THandle;
    ResList: TStringList;
begin
   
ResList := TStringList.Create;
    ResList.Add('_IS_BOTVA, botva2.dll');  // 'Имя ресурса, имя файла'
   
ResList.Add('_IS_BPIC, bPic.png');
    ResList.Add('_IS_LIPIC, LiPic.png');
    ResList.Add('_IS_APIC, aPic.png');

    with WizardForm do
    begin
       
WelcomePage.Color := AXEL_YELLOW;
        MainPanel.Color := AXEL_YELLOW;

        if ExtractResource(ResList) then
        begin
           
PicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
            WizardBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(WelcomePage.Handle);
           
            PicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
            WizardBitmapImage2.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(FinishedPage.Handle);
           
            PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;


procedure DeinitializeSetup;
begin
    if
FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
   
PicHandle: THandle;
    ResList: TStringList;
begin
    with
UninstallProgressForm do
    begin
       
MainPanel.Color := AXEL_YELLOW;
   
        ResList := TStringList.Create;
        ResList.Add('_IS_BOTVA, botva2.dll');
        ResList.Add('_IS_LIPIC, LIPic.png');

        if ExtractResource(ResList) then
        begin
           
PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;


procedure DeinitializeUninstall();
begin
    if
FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;



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

insombia,
Цитата:

Цитата insombia
Johny777 а как в твоем примере растянуть картинку на весь инсталл? как фоновой так и маленькой »

хочешь удивлю?
перед тем как сделать тот пример открыл пример ботвы ...\Inno Setup 5\Modules\South\botva2_example\image.iss и посмотрел как создать картинку. До этого ботву не использовал и не знал
потом открыл модуль где автор любезно под каждым прототипом функции по русски описал все входные аргументы и сделал пример!
цитирую описание к функции ImgLoad(...):
читать дальше »
Код:

function ImgLoad(Wnd :HWND; FileName :PAnsiChar; Left, Top, Width, Height :integer; Stretch, IsBkg :boolean) :Longint; external 'ImgLoad@{tmp}\botva2.dll stdcall delayload';
//загружает изображение в память, сохраняет переданные параметры
//Wnd          - хэндл окна, в котором будет выведено изображение
//FileName    - файл изображения
//Left,Top    - координаты верхнего левого угла вывода изображения (в координатах клиентской области Wnd)
//Width,Height - ширина, высота изображения
//              если Stretch=True, то изображение будет растянуто/сжато в прямоугольной области
//              Rect.Left:=Left;
//              Rect.Top:=Top;
//              Rect.Right:=Left+Width;
//              Rect.Bottom:=Top+Height;
//              если Stretch=False, то параметры Width,Height игнорируются и вычисляются самой ImgLoad, т.е. можно передать 0
//Stretch      - масштабировать изображение или нет
//IsBkg        - если IsBkg=True, изображение будет выведено на фоне формы,
//              поверх него будут отрисованы графические объекты (TLabel, TBitmapImage и т.д.),
//              затем поверх всего будут выведены изображения с флагом IsBkg=False
//возвращаемое значение - указатель на структуру, хранящей изображение и его парметры, приведенный к типу Longint
//изображения будут выведены в той последовательности, в которой вызывается ImgLoad


Напрашивается вопрос: Ты хоть сам пробовал немного разобраться прежде чем спрашивать?
короче настраивай последние в вышеупомянутой функции
...Width, Height :integer; Stretch, IsBkg :boolean) :Longint;
...ширина, высота - целочисленные значения (пиши при необходимости через ScaleY,X() ), растянуть, на фоне - булев значения): Longint;

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

UPD:
saurn,
Цитата:

Цитата saurn
Небольшой вопрос по вашему примеру для отображения процентов http://forum.oszone.net/post-2123218-47.html , как его корректно реализовать в деинсталяторе? »

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

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

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

const
   
WM_USER                = $0400;
//    CCM_FIRST              = $2000;
//    CCM_SETBKCOLOR          = CCM_FIRST + 1;
//
//    PBS_SMOOTH              = 01;
//    PBS_VERTICAL            = 04;
//    PBM_SETRANGE            = WM_USER+1;
   
PBM_SETPOS              = WM_USER+2;
//    PBM_DELTAPOS            = WM_USER+3;
//    PBM_SETSTEP            = WM_USER+4;
//    PBM_STEPIT              = WM_USER+5;
//    PBM_SETRANGE32          = WM_USER+6;  // lParam = high, wParam = low
   
PBM_GETRANGE            = WM_USER+7;  // lParam = PPBRange or Nil
//            // wParam = False: Result = high
//            // wParam = True: Result = low
   
PBM_GETPOS              = WM_USER+8;
//    PBM_SETBARCOLOR        = WM_USER+9;    // lParam = bar color
//    PBM_SETBKCOLOR          = CCM_SETBKCOLOR;  // lParam = bkColor
//
//    { For Windows >= XP }
//    PBS_MARQUEE            = $08;
//    PBM_SETMARQUEE          = WM_USER+10;
//
//    { For Windows >= Vista }
//    PBS_SMOOTHREVERSE      = $10;
//
//    { For Windows >= Vista }
//    PBM_GETSTEP            = WM_USER+13;
//    PBM_GETBKCOLOR          = WM_USER+14;
//    PBM_GETBARCOLOR        = WM_USER+15;
//    PBM_SETSTATE            = WM_USER+16;  { wParam = PBST_[State] (NORMAL, ERROR, PAUSED) }
//    PBM_GETSTATE            = WM_USER+17;
//
//    { For Windows >= Vista }
//    PBST_NORMAL            = $0001;
//    PBST_ERROR              = $0002;
//    PBST_PAUSED            = $0003;

   
GWL_WNDPROC = -4;


type
   
LPARAM = Integer;
    WPARAM = Integer;
    LRESULT = Integer;
    TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

var
   
OldProgressBarProc, hInstallStatusLabel, hInstallProgressBar: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
   
UndefPosition, UndefMax: Longint;
begin
    if
Msg = PBM_SETPOS then
    begin
       
UndefPosition := SendMessage(hInstallProgressBar, PBM_GETPOS, 0, 0);
        UndefMax := SendMessage(hInstallProgressBar, PBM_GETRANGE, 0, 0);
        SetWindowText( hInstallStatusLabel, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (UndefPosition*100)/UndefMax)]) );
    end;

    Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
   
hInstallProgressBar := WizardForm.ProgressGauge.Handle;
    OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
    hInstallStatusLabel := WizardForm.StatusLabel.Handle;
end;

procedure DeinitializeSetup();
begin
   
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

//////////////////////////////////////////////////////////////////////

var
   
hUnistallProgress, hUninstallStatusLabel: Longint;

function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
   
UndefPosition, UndefMax: Longint;
begin
    if
Msg = PBM_SETPOS then
    begin
       
UndefPosition := SendMessage(hUnistallProgress, PBM_GETPOS, 0, 0);
        UndefMax := SendMessage(hUnistallProgress, PBM_GETRANGE, 0, 0);
        SetWindowText( hUninstallStatusLabel, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (UndefPosition*100)/UndefMax)]) );
    end;

    Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure UninstallFormOnHide(Sender: TObject);
begin
   
SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

procedure InitializeUninstallProgressForm();
begin
   
hUnistallProgress := UninstallProgressForm.ProgressBar.Handle;
    hUninstallStatusLabel := UninstallProgressForm.StatusLabel.Handle;
    OldProgressBarProc := SetWindowLong(hUnistallProgress, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
    UninstallProgressForm.OnHide := @UninstallFormOnHide;
end;


+ улучшил код:
1. Проценты отображаются в лучшем месте, чем в заголовке формы
2. Теперь никакого прямого обращения к контролам через оконную процедуру - всё обращение теперь на чистом WinApi (это гарантированно избавит от возможных ошибок) через адреса
PS: И обращайся на Ты, а то мне как-то не по себе! :)

UPD: Обновлённый пример благодаря правке El Sanchezhttp://forum.oszone.net/post-2125286-79.html :)
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

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

const
   
WM_USER = $0400;
    PBM_SETPOS = WM_USER+2;
    GWL_WNDPROC = -4;


type
   
LPARAM = Integer;
    WPARAM = Integer;
    LRESULT = Integer;
    TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

var
   
OldProgressBarProc: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
    if
Msg = PBM_SETPOS then with WizardForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (ProgressGauge.Position*100)/ProgressGauge.Max)]) );

    Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
   
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;

procedure DeinitializeSetup();
begin
   
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

/////////////////////////////// Uninstall //////////////////////////////////


function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
    if
Msg = PBM_SETPOS then with UninstallProgressForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (ProgressBar.Position*100)/ProgressBar.Max)]) );

    Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure UninstallFormOnHide(Sender: TObject);
begin
   
SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

procedure InitializeUninstallProgressForm();
begin
   
OldProgressBarProc := SetWindowLong(UninstallProgressForm.ProgressBar.Handle, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
    UninstallProgressForm.OnHide := @UninstallFormOnHide;
end;



habib2302 03-04-2013 02:54 2124683

saurn, sorry!!!!все работает

Tco 03 03-04-2013 11:11 2124827

Цитата:

Цитата Johny777
Короче зацени function ExtractResource(var ResourceList: TStringList): Boolean; »

Заценил! :coffee:
После удаления программы в папке TEMP остаётся мусор, ровно такого размера, что и unins000.exe

Gnom_aka_Lexander 03-04-2013 15:10 2124984

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

Tco 03 03-04-2013 16:09 2125034

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

Johny777 03-04-2013 17:40 2125122

Tco 03, Спасибо за внимательность! :) Хорошо, что есть люди которые помогают сделать лучше! Назвал имя батника удаления в твою честь из благодарности!

to All
теперь собственно о файле:
1. Он зовётся именем процесса деинсталятора и деинсталятор держит его пока процесс не убьётся, а значит удалить файл через код напрямую нельзя ни на каком этапе или процедуре связанных с деинсталятором
2. Этот файл кстати остаётся даже после простейшего скрипта, что говорит о возможной недоработке Инно
например попробуйте установить и удалить этот скрипт и в темпе останется похожий файл:
Код:

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup

Но путём изврата удалось реализовать метод его удаления:
Взяв за основу функцию El Sanchez-а "Определение рабочей папки процесса" http://forum.oszone.net/post-1945281-380.html и упростив её до получения имени нашего процесса
(функция function GetCurrentProcessId(): DWORD; всё упрощает)
мы получаем путь к тому самому файлу... и удаляем его малость модифицированным мной примером Genri (самоудаление) (исходник http://forum.ru-board.com/topic.cgi?...8&start=1280#3 )
вот исправленный пример с ботвой:
читать дальше »
Код:

#include "botva2.iss"

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
   
AXEL_YELLOW = $48c1ca;
    RT_RCDATA = 10;
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;



function ExtractResource(var ResourceList: TStringList): Boolean;
var
   
ResStreams: array of TResourceStream;
    ResName, ResFile: String;
    i: Integer;
begin
    if
ResourceList = nil then Exit;
    Result := ResourceList.Count > 0;
    SetArrayLength(ResStreams, ResourceList.Count);
    try
        for
i := 0 to ResourceList.Count-1 do
        try
           
ResName := Trim( Copy(ResourceList.Strings[i], 1, Pos(',', ResourceList.Strings[i])-1) );
            ResFile := Trim( Copy(ResourceList.Strings[i], Pos(',', ResourceList.Strings[i])+1, Length(ResourceList.Strings[i])-Pos(',', ResourceList.Strings[i])) );
            ResStreams[i] := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
            ResStreams[i].SaveToFile(ExpandConstant('{tmp}\') + ResFile);
            Result := Result and FileExists(ExpandConstant('{tmp}\') + ResFile);
        finally
           
ResStreams[i].Free;
        end;
    finally
       
ResourceList.Free;
    end;
end;


function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
   
szExeFile: array [0..MAX_PATH-1] of Char;
    hProc: THandle;
begin
   
hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
    if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
    begin
       
Result := '';
        while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
        Result := RemoveBackSlash(Result);
    end;
end;



procedure InitializeWizard;
var
   
PicHandle: THandle;
    ResList: TStringList;
begin
   
ResList := TStringList.Create;
    ResList.Add('_IS_BOTVA, botva2.dll');  // 'Имя ресурса, имя файла'
   
ResList.Add('_IS_BPIC, bPic.png');
    ResList.Add('_IS_LIPIC, LiPic.png');
    ResList.Add('_IS_APIC, aPic.png');

   

    with WizardForm do
    begin
       
WelcomePage.Color := AXEL_YELLOW;
        MainPanel.Color := AXEL_YELLOW;

        if ExtractResource(ResList) then
        begin
           
PicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
            WizardBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(WelcomePage.Handle);

            PicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
            WizardBitmapImage2.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(FinishedPage.Handle);

            PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;


procedure DeinitializeSetup;
begin
    if
FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;

/////////////////////////////////////////////////////////////////////


procedure SelfDelete(const FileName: String);
var
   
BatName: String;
    ResultCode: Integer;
begin
   
BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
    if SaveStringToFile(BatName,
        '@echo off' + #10#13 +
        ':LOOP'    + #10#13 +
        'del ' + '"' + FileName + '"' + #10#13 +
        'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
        'del ' + '"' + BatName + '"',
    False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;



procedure InitializeUninstallProgressForm();
var
   
PicHandle: THandle;
    ResList: TStringList;
begin
   
MsgBox('путь к файлу от которого исходит процесс нашей программы:' +#13#10 + GetMyProcName(), mbInformation, MB_OK);

    with UninstallProgressForm do
    begin
       
MainPanel.Color := AXEL_YELLOW;
       
        ResList := TStringList.Create;
        ResList.Add('_IS_BOTVA, botva2.dll');
        ResList.Add('_IS_LIPIC, LIPic.png');

        if ExtractResource(ResList) then
        begin
           
PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;


procedure DeinitializeUninstall();
begin
    if
FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
    SelfDelete(GetMyProcName);
end;



вот просто пример удаления этого файла:
читать дальше »
Код:

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup

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

const
   
PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;

function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

procedure SelfDelete(const FileName: String);
var
   
BatName: String;
    ResultCode: Integer;
begin
   
BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
    if SaveStringToFile(BatName,
        '@echo off' + #10#13 +
        ':LOOP'    + #10#13 +
        'del ' + '"' + FileName + '"' + #10#13 +
        'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
        'del ' + '"' + BatName + '"',
    False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;


function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
   
szExeFile: array [0..MAX_PATH-1] of Char;
    hProc: THandle;
begin
   
hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
    if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
    begin
       
Result := '';
        while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
        Result := RemoveBackSlash(Result);
    end;
end;

procedure DeinitializeUninstall();
begin
   
SelfDelete(GetMyProcName);
end;



Цитата:

Цитата Gnom_aka_Lexander
Хотя - убирать за собой - можно назвать одним из основополагающих »

Походу в Restools не принято, ведь файл оставляет инно по умолчанию без участия автора инсталла! :)

PS: просьба потестировать на всякий случай!

Gnom_aka_Lexander 03-04-2013 17:57 2125133

Цитата:

Цитата Johny777
Походу в Restools не принято »

Но они и не обновляли очень давно. Я лично пользуюсь своей сборкой, на базе инно именно 5.5.1 и соответствующей версией расширенной. то-есть апдейт Inno Setup Compiler(build 121216)ни в коем случае не использую, поскольку он уже на базе 5.5.2, скорей всего не страшно, но я люблю ,чтоб все соответствовало, ибо только так можно добиться безглючности и стабильности. так вот. в простейшем варианте папка темп у меня отлично удаляется сама собой, хотя подчистка временной папки на выходе у меня всегда на всякий случай есть.

Johny777 03-04-2013 18:03 2125135

Gnom_aka_Lexander,
читать дальше »
читать дальше »
читать дальше »
Gnom_aka_Lexander, пока никакой инно не пользуюсь, она стоит только чтоб на форуме помогать :) тк переношу/реализую проект инсталла халфы на дельфи(2010 пока что) по некоторым причинам не в пользу инно, но проект всё ещё в зародыше.

Цитата:

Цитата Gnom_aka_Lexander
хотя подчистка временной папки на выходе у меня всегда на всякий случай есть. »

можешь пожалуйста показать мне исходник как чистишь темп после инно? (Такой пример я б себе сохранил на всякий случай)

И кстати кто хорошо знает Вин Апи или/и реестр? Можно ли как-то добавить задачу винде на то же самое удаление например (не после перезагрузки). Что-то вроде задержки

Gnom_aka_Lexander 03-04-2013 18:38 2125153

Цитата:

Цитата Johny777
Можно ли как-то добавить задачу винде на то же самое удаление например (не после перезагрузки). Что-то вроде задержки »

както так:
Код:

var
  res ; integer;
begin
  Exec('cmd', '/c at 12:00 C:\MyProga.exe',ExpandConstant('{win}'), SW_Hide, ewNoWait, res);

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

Tco 03 03-04-2013 19:13 2125174

Цитата:

Цитата Johny777
просьба потестировать на всякий случай! »

Теперь всё чисто! Что создалось, то и удалилось.
Чище только так: cd /d "%temp%" && rd /s /q "." :teeth:
Только я бы вписал вместо: LOOP - trydel и соответственно: goto trydel ну это так, каждый хочет поумничить :grin:

El Sanchez 03-04-2013 22:24 2125286

Цитата:

Цитата Johny777
2. Теперь никакого прямого обращения к контролам через оконную процедуру - всё обращение теперь на чистом WinApi »

Johny777, что так? Ты ж не из другого потока к контролам обращаешься.
Цитата:

Цитата Johny777
это гарантированно избавит от возможных ошибок »

Johny777, от каких?
Цитата:

Цитата Johny777
if Msg = PBM_SETPOS then
begin
UndefPosition := SendMessage(hInstallProgressBar, PBM_GETPOS, 0, 0); »

Johny777, первые 2 вызова PBM_GETPOS в обработчике PBM_SETPOS при данной реализации вернут 0, поэтому 100% ты никогда не увидишь. Используй wParam.
Цитата:

Цитата Johny777
(UndefPosition*100)/UndefMax »

Johny777, проверяй UndefMax на 0, вдруг SendMessage с PBM_GETRANGE обделается.
Цитата:

Цитата Johny777
2. Этот файл кстати остаётся даже после простейшего скрипта, что говорит о возможной недоработке Инно »

Johny777, это нормальное поведение. tmp-файл деинсталлятора удалится при следующей перезагрузке.

Johny777 04-04-2013 03:23 2125387

El Sanchez,
Цитата:

Цитата El Sanchez
от каких? Ты ж не из другого потока к контролам обращаешься.»

В том то и дело, думал что это поток. Вспомнил маты винды на указатели, переполнение стека и прочее когда к контролам обращался из каллбэка твоей имплементации 7-zip в инно
Цитата:

Цитата El Sanchez
первые 2 вызова PBM_GETPOS в обработчике PBM_SETPOS при данной реализации вернут 0, поэтому 100% ты никогда не увидишь. Используй wParam.
, проверяй UndefMax на 0, вдруг SendMessage с PBM_GETRANGE обделается.»

Вернулся назад к обращению к контролам. Код стал проще и короче. Думаю это финальная версия. (отредактировал предыдущий пост http://forum.oszone.net/post-2124681-69.html )
Цитата:

Цитата El Sanchez
Johny777, это нормальное поведение. tmp-файл деинсталлятора удалится при следующей перезагрузке. »

не знал :(. Вот винда удивится, когда этот файл не найдёт...
===========
Спасибо тебе большое за исправления. Теперь я знаю и умею больше!
PS: просьба и дальше делать: El_Sanchez.Сообщение.Текст := Ошибка(неверный_код^) + #13#10 + Исправление; , когда у меня будут ошибки или недоработки! ;)

Serega 05-04-2013 18:12 2126403

Всем привет!
Цитата:

Цитата Johny777
Взяв за основу функцию El Sanchez-а "Определение рабочей папки процесса" http://forum.oszone.net/post-1945281-380.html и упростив её до получения имени нашего процесса »

У El Sanchez, функция определяет путь к любому процессу, а вы пытаетесь определить путь к своему, поэтому ParamStr вам поможет, одним словом проще будет так:
читать дальше »

Код:

procedure SelfDelete;
var
  ResultCode: Integer;
begin
  Exec('cmd.exe', '/c del ' + AddQuotes(ParamStr(0)), '', SW_HIDE, ewNoWait, ResultCode);
end;


Цитата:

Цитата El Sanchez
tmp-файл деинсталлятора удалится при следующей перезагрузке. »

Так то да, но я просто знаю машины, которые перезагружаются раз в месяц, вот там то SelfDelete желателен, но на самом деле это не критично...

neorom 05-04-2013 18:22 2126410

Как переделать простой скрипт, что при движении процесс бара одноврименно ишли плавно проценти ((с 0.0% до 100.0%) а не ривком 0% потом 100%, и в скрипте можна било менять координати розмишчения процентов в окне инсталяции) .
Скрипт из шапки
читать дальше »
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: files\*; DestDir: {app}; AfterInstall: ExtLog(); Flags: recursesubdirs

[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:= 4
ProgressLabel.Left:= 200
ProgressLabel.Caption:= '0%'
ProgressLabel.AutoSize:= True
ProgressLabel.Font.Color:= clBlue
ProgressLabel.Font.Style:= [fsBold]
ProgressLabel.Transparent:= True
ProgressLabel.Parent:= WizardForm.ProgressGauge
end;

saurn 05-04-2013 22:05 2126561

neorom

Конкретно в данном примере:

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

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: files\*; DestDir: {app}; AfterInstall: ExtLog(); Flags: recursesubdirs

[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:= 4
ProgressLabel.Left:= 200
ProgressLabel.Caption:= '0%'
ProgressLabel.AutoSize:= True
ProgressLabel.Font.Color:= clBlue
ProgressLabel.Font.Style:= [fsBold]
ProgressLabel.Transparent:= True
ProgressLabel.Parent:= WizardForm.ProgressGauge
end;



Более - менее плавное отображение процентов будет возможном только, если инсталятор содержит файлы небольшого размера, так как здесь проценты обновляются после того, как файл уже скопирован на диск(о чем ясно говорит процедура AfterInstall, то есть После установки). Иными словами, если у вас в инсталяторе, к примеру, пара файлов весом по несколько гигабайт, то проценты будут делать большие скачки. Лучше использовать другие способы отображения процентов, на форуме много различных примеров, пользуйтесь поиском. Например вот Пост .Так же, пару страниц назад уважаемый Johny777 выкладывал прекрасный пример отображения процентов установки и удаления.

Насчет изменения координат контрола, за это отвечают параметры Left(положение по горизонтали), Top(положение по вертикали). За размеры контрола отвечают Width(ширина), Height(высота) Можете так же создать свой лейбл и делать с ним, что угодно.
Координаты указываются так:
Код:

Left := ScaleX(24); //Положение по горизонтали от левого края клиента
Top := ScaleY(64); //Положение по вертикали от верхнего края клиента
Width := ScaleX(450);  //Ширина
Height := ScaleY(235); //Высота

А лучше в одну строчку:

Код:

SetBounds(ScaleX(24), ScaleY(64), ScaleX(450), ScaleY(235)); //procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer);

LagunaFAN 06-04-2013 12:01 2126749

Товарищи! Нужна ваша помощь! :( Хочу вот этот скрипт отучить от ISDone и не получается :( Пытался удалить все функции, но после компиляции, при запуске, пишет, что при Extract Temporary File не найден ISDone.dll . Поэтому прошу помощи. Самому не хватает знаний :(

insombia 06-04-2013 13:01 2126775

LagunaFAN походу скрипт заточен под исдон

Gnom_aka_Lexander 06-04-2013 13:28 2126782

Вложений: 1
insombia, нет скриптов заточеных под исдон. там тупо выпилить все функции, для которых он нужен и все.

В аттаче 2 файла, которые нужно заменить. и соответственно в модулях удалить модуль исдона.

LagunaFAN 06-04-2013 13:39 2126786

Gnom_aka_Lexander, огромное спасибо за помощь! :Beer:

neorom 07-04-2013 10:02 2127307

Цитата:

Цитата saurn
Johny777 выкладывал прекрасный пример отображения процентов установки и удаления. »

А может кто то удалить все лишнее из того скрипта от Johny777 и оставить только проценти при установки, бо у меня не получаэться.

saurn 07-04-2013 11:21 2127318

neorom

Убрать или закомментировать всё, что ниже строчки //////////////////////////////Uninstall/////////////////////////////

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

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

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

const
   
WM_USER = $0400;
    PBM_SETPOS = WM_USER+2;
    GWL_WNDPROC = -4;


type
   
LPARAM = Integer;
    WPARAM = Integer;
    LRESULT = Integer;
    TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

var
   
OldProgressBarProc: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
    if
Msg = PBM_SETPOS then with WizardForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (ProgressGauge.Position*100)/ProgressGauge.Max)]) );

    Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
   
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;

procedure DeinitializeSetup();
begin
   
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

/////////////////////////////// Uninstall //////////////////////////////////


//function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
//begin
//    if Msg = PBM_SETPOS then with UninstallProgressForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (ProgressBar.Position*100)/ProgressBar.Max)]) );
//
//    Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
//end;
//
//procedure UninstallFormOnHide(Sender: TObject);
//begin
//    SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
//end;
//
//procedure InitializeUninstallProgressForm();
//begin
//    OldProgressBarProc := SetWindowLong(UninstallProgressForm.ProgressBar.Handle, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
//    UninstallProgressForm.OnHide := @UninstallFormOnHide;
//end;



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

neorom 07-04-2013 14:39 2127444

А можно ли зделать чтоби процедура которая отвечаэт за проценти, брала информацию из отображения процес бара(двигаэтся процес бар и идут процети). Эсли да то дайте пример.

Gnom_aka_Lexander 07-04-2013 14:41 2127446

neorom, Собственно, постом выше, откуда думаешь, информация вычисляется? Элементарная пропорция, 7 или 8-й класс средней школы. в качестве данных берется как раз отношение текущего состояния прогресса к его максимум в соотношении к 100 процентам.

LagunaFAN 07-04-2013 15:22 2127465

Добрый день! Други, снова нужна помощь! Сам я не особо в скриптах разбираюсь. Хочу в рамках вот этого скрипта добавить чекбокс (допустим, на странице с приветствием), чтобы он выполнял 2 условия:

1, Если чекбокс отмечен, то на странице с выбором каталога для установки автоматически устанавливается каталог со стимом (данные берутся из реестра)
2. (По возможности) Если чекбокс отмечен, то некоторые файлы из секции Files, копируются в каталог, который указан в секции Files. Тут, я так понимаю, можно было бы задействовать параметр Check.

Не смею многого просить, но я был бы благодарен, если бы второе условие тоже соблюдалось :blush: Пытался сделать на основе того, что уже есть в скрипте, но ничего не получается :(


UPD: Всем спасибо за внимание! Помучился, но сделал! :rupor:

neorom 07-04-2013 17:38 2127570

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

insombia 07-04-2013 19:19 2127654

neorom юзай исдон

Tima182 07-04-2013 20:23 2127727

Привет. Помогите, как создать установку в указанную папку что бы вне зависимости от имя профиля в винде ставилась игра ".minecraft" в папку C:\Users\у каждого будет свое имя профиля\AppData\Roaming\.minecraft ?
Или в винде XP: C:\Documents and Settings\у каждого будет свое имя профиля\Application Data\.minecraft
Ну что бы имя твоего профиля винды ставилось само во время установки.
Что в скрипте надо дописать/изменить?
Есть готовая игра, нельзя изменить папку, но там путь сразу автоматически который надо.
Я игру моддил и сейчас надо установку без выбора папки установки создать.
Вот пример
читать дальше »
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Minecraft"
#define MyAppVersion "1.4.7"
#define MyAppPublisher "Tima"
#define MyAppExeName "Minecraft.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={{DAAFDCA5-5F82-466E-9499-6875E9FFFE7F}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\.minecraft
DisableDirPage=yes
DefaultGroupName={#MyAppName}
OutputDir=C:\Users\Тима\Desktop
OutputBaseFilename=setup
Compression=lzma/ultra
SolidCompression=true
PrivilegesRequired=none

[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:\Users\Тима\AppData\Roaming\.minecraft\Лаунчеры\Minecraft.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; 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


Gnom_aka_Lexander 07-04-2013 20:43 2127751

Цитата:

Цитата Tima182
[Files]
Source: C:\Users\Тима\AppData\Roaming\.minecraft\Лаунчеры\Minecraft.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs »

Во первых, первая строчка не имеет смысла, ибо все это будет скопировано по условиям во второй строке.
ну а путь установки... собственно константа {userappdata} ведет именно туда, куда нужно.
Код:

[Files]
Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: "{userappdata}\.minecraft"; Flags: ignoreversion recursesubdirs createallsubdirs

ну или
Код:

[Setup]
AppName=Minecraft
AppVersion=b 1.3_01
DefaultDirName={userappdata}\.minecraft\

и запретить редактировать путь установки - я так делал для FlyPlay.ru

Tima182 07-04-2013 21:07 2127767

Спасибо огромное.
А все, разобрался.
А как замутить удаление всей папки куда поставилась игра?
Как сделать что бы галочка была всегда что ярлык на рабочий стол поместится?

Gnom_aka_Lexander 07-04-2013 22:01 2127817

Tima182, если честно, весь мне несколько стыдно выкладывать, ибо писался он года 3 тому назад. И по этой причине вряд-ли он подходит для изучения. Хотя, если причесать чуток.. Мне-то не жалко :)
Скачать

Tima182 07-04-2013 22:03 2127821

Спасибо. А как это использовать в установке игры?
В скрипт как вписать?

Gnom_aka_Lexander 07-04-2013 22:05 2127825

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

Tima182 07-04-2013 22:08 2127834

Распаковать в любую папку, запустить скрипт, чуть отредактировать и компиллировать сетап?

Gnom_aka_Lexander 07-04-2013 22:11 2127836

Ооо... Ты-ж скачал? там вроде все понятно. Можно удалить все, что касается jre и Java из этого скрипта, в остальное - просто кладешь рядом папку .minecraft со своей сборкой и компилишь.

Tima182 07-04-2013 22:31 2127853

Мне просто установка нужна.
Я кинул, ругается на много чего...
У меня проблема, помогите на рабочий стол и в пуск создать по 3 ярлыка игры?
При компиляции сетупа ехе игры находится в папке %AppData%\.minecraft\Лаунчеры
А когда скомпилирует, установится, ехе игры уже тут находится %AppData%\.minecraft
Помогите исправить?
1 имя: MultiMinecrafter
2 имя: XRAM Launcher
Все ехе.
А в конце установки нужно что бы был 1 запуск игры.
читать дальше »
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Minecraft"
#define MyAppVersion "1.4.7"
#define MyAppExeName "Minecraft.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={{30F4D7A3-7C27-4A82-9977-F785B48D23FE}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={userappdata}\.minecraft\
DisableDirPage=true
DefaultGroupName={#MyAppName}
OutputDir=C:\Users\Тима\Desktop
OutputBaseFilename=Minecraft
Compression=lzma/ultra
SolidCompression=true
PrivilegesRequired=none

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: C:\Users\Тима\AppData\Roaming\.minecraft\Лаунчеры\Minecraft.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; 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

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent


insombia 07-04-2013 23:07 2127888

Tima182 пример для 3 ярлыков
Name: {userdesktop}\icon1; Filename: {app}\icon1.exe; WorkingDir: {app}\Лаунчеры; Check: MakeDesktopIcon and checkerror
Name: {userdesktop}\icon2; Filename: {app}\icon2.exe; WorkingDir: {app}\Лаунчеры; Check: MakeDesktopIcon and checkerror
Name: {userdesktop}\icon3; Filename: {app}\icon3.exe; WorkingDir: {app}\Лаунчеры; Check: MakeDesktopIcon and checkerror

Name: {group}\icon1; Filename: {app}\icon1.exe; Check: MakeDesktopIcon and checkerror
Name: {group}\icon2; Filename: {app}\icon2.exe; Check: MakeDesktopIcon and checkerror
Name: {group}\icon3; Filename: {app}\icon3.exe; Check: MakeDesktopIcon and checkerror
думаю я тебя правильно понял?

Помогите исправить?
1 имя: MultiMinecrafter
2 имя: XRAM Launcher
не совсем понял что тебе нужно?

Цитата:

Помогите исправить?
1 имя: MultiMinecrafter
2 имя: XRAM Launcher
не понял что тебе именно нужно?

Tima182 07-04-2013 23:31 2127899

В скрипт добавить что бы создавались для 3-х файлов ярлыки: пуск>программы>minecraft, и на рабочий стол.
3 файла:
minecraft
MultiMinecrafter
XRAM Launcher
Которым нужно что бы создавались ярлыки в 2-х местах.
И еще нужно что бы значек был каждой своей ехе, к которой будет ярлык в программах и рабочий стол.
И еще что бы 3 галочки можно было ставить в конце, запуск приложений.
А лучше что бы 1 галочка на саму игру minecraft.exe стояла, а вторые дополнительно.
Вот и все.

habib2302 07-04-2013 23:42 2127905

доброе время суток.я незнаю как это объяснть?короче.я делаю репак aida64 2в1.например.общая папка
Код:

{pf}\FinalWire
а при выборе компанента AIDA64 Business Edition дописывалась автоматически папка.например был
Код:

{pf}\FinalWire
а стал
Код:

{pf}\FinalWire\AIDA64 Business Edition

saurn 08-04-2013 03:25 2127971

habib2302, установка каждой версии в свою подпапку? В вашем скрипте это есть.

Код:

#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"

[Setup]
DefaultDirName={pf}\FinalWire

[Files]
Source: {app}\{#AIDA641}\*; DestDir: {app}\{#AIDA641}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}\{#AIDA642}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;


Nightwishh 08-04-2013 03:39 2127972

Ребят а подскажите, можно ли вместо WizardForm.DirEdit использывать Label или Memo или Panel для указания пути, просто WizardForm.DirEdit не имеет св-ва прозрачности, а мне хотелось бы сделать эту рамку прозрачной, если можно то как?

saurn 08-04-2013 04:32 2127975

Nightwishh, тут оно?

---------------------------------------------------------------------------------------------------------------------
neorom, в чем сложность? Скрипт покажите.

Ну и, если хочется проценты через внешнюю библиотеку, пожалуйста:
читать дальше »
Код:

[Files]
Source: InnoCallback.dll; Flags: dontcopy noencryption nocompression deleteafterinstall;

[Code]

type
 
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);


function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@{tmp}\InnoCallback.dll stdcall delayload';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

var
 
pLabel: TLabel;
  pTimer: LongWord;

function InitializeSetup(): Boolean;
begin
  if not
FileExists(ExpandConstant('{tmp}\InnoCallback.dll')) then ExtractTemporaryFile('InnoCallback.dll');
  Result := True;
end;

function pStr(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 pInstall(h, msg, idevent, dwTime: Longword);
begin
  with
WizardForm.ProgressGauge do
  begin
   
pLabel.Caption:= pStr((Position*100)/Max) + '%';
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
CurStep of
   
ssInstall:
    begin
     
pLabel := TLabel.Create(nil);
      with pLabel do
      begin
       
Parent := WizardForm.ProgressGauge;
        SetBounds(WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top + 2, WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height);
        Alignment := taCenter;
        Align := alNone;
        AutoSize := False;
        Font.Color := clBlack;
        Font.Height := -12;
        Font.Name := 'Tahoma';
        Font.Style := [fsBold];
        Transparent := True;
      end;

      pTimer:= SetTimer(0, 0, 100, WrapTimerProc(@pInstall, 4));
    end;

    ssPostInstall:
    begin
     
KillTimer(0, pTimer);
      pLabel.Free;
    end;
  end;
end;

procedure DeinitializeSetup();
begin
 
KillTimer(0, pTimer);
end;



---------------------------------------------------------------------------------------------------------------------
Tima182

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

#define MyAppName "Minecraft"
#define MyAppVersion "1.4.7"
#define MyAppExeName "Minecraft.exe"
#define MultiMinecrafter "MultiMinecrafter.exe"
#define XRAM Launcher "XRAM Launcher.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={{30F4D7A3-7C27-4A82-9977-F785B48D23FE}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={userappdata}\.minecraft\
DisableDirPage=true
DefaultGroupName={#MyAppName}
OutputDir=C:\Users\Тима\Desktop
OutputBaseFilename=Minecraft
Compression=lzma/ultra
SolidCompression=true
PrivilegesRequired=none

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

[Files]
;Зачем здесь эта строка, если во второй строке из этой же папки все файлы копируются по маске?
;Source: C:\Users\Тима\AppData\Roaming\.minecraft\Лаунчеры\Minecraft.exe; DestDir: {app}; Flags: ignoreversion

Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Icons]
Name: {group}\Minecraft;                          Filename: {app}\Лаунчеры\{#MyAppExeName};    WorkingDir: {app}\Лаунчеры;
Name: {group}\MultiMinecrafter;                  Filename: {app}\Лаунчеры\{#MultiMinecrafter}; WorkingDir: {app}\Лаунчеры;
Name: {group}\XRAM Launcher;                      Filename: {app}\Лаунчеры\{#XRAM Launcher};    WorkingDir: {app}\Лаунчеры;
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe};

Name: {commondesktop}\Minecraft;        Filename: {app}\Лаунчеры\{#MyAppExeName};    WorkingDir: {app}\Лаунчеры; Tasks: desktopicon;
Name: {commondesktop}\MultiMinecrafter; Filename: {app}\Лаунчеры\{#MultiMinecrafter}; WorkingDir: {app}\Лаунчеры; Tasks: desktopicon;
Name: {commondesktop}\XRAM Launcher;    Filename: {app}\Лаунчеры\{#XRAM Launcher};    WorkingDir: {app}\Лаунчеры; Tasks: desktopicon;

[Run]
Filename: {app}\Лаунчеры\{#MyAppExeName};    Description: Запустить Minecraft;        Flags: nowait postinstall skipifsilent
Filename: {app}\Лаунчеры\{#MultiMinecrafter}; Description: Запустить MultiMinecrafter; Flags: nowait postinstall skipifsilent unchecked
Filename: {app}\Лаунчеры\{#XRAM Launcher};    Description: Запустить XRAM Launcher;    Flags: nowait postinstall skipifsilent unchecked


audiofeel 08-04-2013 09:11 2128015

Доброе утро всем, подскажите с примером "Запись имя пользователя в ini" - мне нужно просто имя в первой строке и во второй пароль, без этих "[ ]" или "=", ну как мне кажется все перепробовал но эти два символа остаются
Код:

[...Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program

[....Code]
var
EditPage: TWizardPage;
MyEdit: TEdit;

procedure MyEditOnChange(Sender: TObject);
begin
if MyEdit.Text = '' then
WizardForm.NextButton.Enabled := False
else
WizardForm.NextButton.Enabled := True;
end;

procedure CreateEditPage();
begin
EditPage := CreateCustomPage(wpWelcome, 'Text_1', 'Text_2');

with TNewStaticText.Create(EditPage) do
begin
AutoSize := False;
WordWrap := True;
SetBounds(0, 0, WizardForm.InnerNotebook.Width, ScaleY(28));
Caption := 'Text_3';
Parent := EditPage.Surface;
end;

with TNewStaticText.Create(EditPage) do
begin
AutoSize := True;
WordWrap := True;
SetBounds(0, ScaleY(28), WizardForm.InnerNotebook.Width, ScaleY(14));
Caption := 'Name:';
Parent := EditPage.Surface;
end;

MyEdit := TEdit.Create(EditPage);
with MyEdit do
begin
SetBounds(0, ScaleY(44), WizardForm.InnerNotebook.Width, ScaleY(21));
OnChange := @MyEditOnChange;
Parent := EditPage.Surface;
end;
end;

procedure InitializeWizard();
begin
CreateEditPage();
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
SetIniString('main', 'user', MyEdit.Text, ExpandConstant('{app}\MyIni.ini'));
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID = EditPage.ID) and (MyEdit.Text = '') then
WizardForm.NextButton.Enabled := False;
end;


saurn 08-04-2013 09:16 2128018

Цитата:

Цитата audiofeel
мне нужно просто имя в первой строке и во второй пароль, без этих "[ ]" или "=" »

Пусть меня поправит, кто-нибудь более сведущий, но в *.ini по-другому нельзя - "[ ]" и "=" создаются неизбежно. Такова структура файла.

----------------------------------------------------------------------
UPD:

Впрочем, можно попробовать записать через Code, посредством SaveStringToFile
Код:

SaveStringToFile(ExpandConstant('{app}')+'\имя файла.ini', 'имя пользователя', true);

audiofeel 08-04-2013 09:22 2128022

saurn, Да вот два часа назад поставил игрушку (вводил ник и пароль) = в папке с игрой ини фаил без [ ] , =. как он (они, оно) это сделал(и)? может попробовать енто дело в простой " .txt" а потом переименовать, но опять вопрос как

saurn,
Цитата:

Цитата saurn
SaveStringToFile(ExpandConstant('{app}')+'\имя файла.ini', 'имя пользователя', true); »

ОК а как это все через "т эдит" сделать , ну вобщем вставить в тот пример

saurn 08-04-2013 09:44 2128032

audiofeel, так же, как вы делали с ini

Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
CurStep of
   
ssPostInstall: SaveStringToFile(ExpandConstant('{app}')+'\имя файла.ini', MyEdit.Text, true)
  ...
end;


habib2302 08-04-2013 10:38 2128072

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

а при выборе компанента AIDA64 Business Edition должно получиться вот так

saurn 08-04-2013 11:10 2128094

habib2302, как-то так:
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  case
CurPageID of
   
wpSelectProgramGroup:
    begin
      if
IsComponentSelected('AIDA642') then
      begin
       
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}';
        WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}';
      end else begin
       
WizardForm.DirEdit.Text := ExpandConstant('{#SetupSetting("DefaultDirName")}');
        WizardForm.GroupEdit.Text := ExpandConstant('{#SetupSetting("DefaultGroupName")}');
      end;
    end;
  end;
end;

///////////////////////////////////////////// можно и так:

var
 
OldCompListOnClickCheck: TNotifyEvent;

procedure ComponentsListOnClickCheck(Sender: TObject);
begin
 
OldCompListOnClickCheck(TNewCheckListBox(Sender));
  case WizardForm.ComponentsList.ItemIndex of
   
0:
    begin
     
WizardForm.DirEdit.Text := ExpandConstant('{#SetupSetting("DefaultDirName")}');
      WizardForm.GroupEdit.Text := ExpandConstant('{#SetupSetting("DefaultGroupName")}');
    end;
    1:
    begin
     
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
      WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
    end;
  end;
end;

procedure InitializeWizard;
begin
 
OldCompListOnClickCheck := WizardForm.ComponentsList.OnClickCheck;
  WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if
CurPageID = wpSelectComponents then ComponentsListOnClickCheck(WizardForm.ComponentsList);
end;


habib2302 08-04-2013 11:31 2128110

и как еще поменять местами страницы SelectDirPage и SelectComponentsPage

saurn 08-04-2013 11:52 2128126

Цитата:

Цитата habib2302
и как еще поменять местами страницы SelectDirPage и SelectComponentsPage »

тут есть пара примеров

nik1967 08-04-2013 12:02 2128130

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

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: 1.ico; DestDir: {app}; Flags: ignoreversion
Source: 2.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AIDA641}\*; DestDir: {app}\{#AIDA641}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}\{#AIDA642}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов                                       

[Icons]
Name: {group}\{#AIDA641}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{#AIDA641}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{#AIDA642}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\2.ico;
Name: {group}\{#AIDA641}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\{#AIDA642}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\{#AIDA641}\Справка {#AIDA641}; Filename: {app}\{#AIDA641}\aida64.chm; Components: AIDA641;
Name: {group}\{#AIDA642}\Справка {#AIDA642}; Filename: {app}\{#AIDA642}\aida64.chm; Components: AIDA642;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;

[Run]
Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

[Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!
const
  RT_RCDATA = 10;

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
  finally
    lResStream.Free;
    Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
  end;
end;

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

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

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
  Result:=True;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
  with WizardForm do
  begin
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  gdipShutdown;
  TaskBarDestroy;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030106402000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167651453656C656374436F6D706F6E656E7473506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED0000F110544E6577436865636B4C697374426F780E436F6D706F6E656E74734C69737403546F70023206486569676874039B000B4578706C69636974546F7002320E4578706C69636974486569676874039B000000F10C544E6577436F6D626F426F780A5479706573436F6D626F0A4974656D486569676874020D00000000000000


habib2302 08-04-2013 12:20 2128136

помогите мне объеденить эти 2 скрипта в один
читать дальше »
Код:

[....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;


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

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpSelectDir:
    begin
      if IsComponentSelected('AIDA641') then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}'
      else WizardForm.DirEdit.Text := ExpandConstant('{#SetupSetting("DefaultDirName")}');
      if IsComponentSelected('AIDA642') then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
      else WizardForm.DirEdit.Text := ExpandConstant('{#SetupSetting("DefaultDirName")}');
    end;
    wpSelectProgramGroup:
    begin
      if IsComponentSelected('AIDA641') then WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}'
      else WizardForm.GroupEdit.Text := ExpandConstant('{#SetupSetting("DefaultGroupName")}');
      if IsComponentSelected('AIDA642') then WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
      else WizardForm.GroupEdit.Text := ExpandConstant('{#SetupSetting("DefaultGroupName")}');
    end ;
  end;
end;


nik1967 08-04-2013 12:28 2128143

habib2302, а выше скрипт посмотреть - религия не позволяет? Я для кого скрипт выложил?

nik1967 08-04-2013 12:50 2128155

habib2302, а просто тупо скопировать мой скрипт и запустить не пробовал?

habib2302 08-04-2013 12:55 2128158

nik1967, скрипт рабочий,но при объединении этих двух скриптов
читать дальше »
Код:

[....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;


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

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpSelectDir:
    begin
      if IsComponentSelected('AIDA641') then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}'
      else WizardForm.DirEdit.Text := ExpandConstant('{#SetupSetting("DefaultDirName")}');
      if IsComponentSelected('AIDA642') then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
      else WizardForm.DirEdit.Text := ExpandConstant('{#SetupSetting("DefaultDirName")}');
    end;
    wpSelectProgramGroup:
    begin
      if IsComponentSelected('AIDA641') then WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}'
      else WizardForm.GroupEdit.Text := ExpandConstant('{#SetupSetting("DefaultGroupName")}');
      if IsComponentSelected('AIDA642') then WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
      else WizardForm.GroupEdit.Text := ExpandConstant('{#SetupSetting("DefaultGroupName")}');
    end ;
  end;
end;


он выдают ошибку

и я тебя прошу.объедени мне пожалуйста эти два скрипта

nik1967 08-04-2013 13:12 2128166

Цитата:

Цитата habib2302
скрипт рабочий,но при объединении этих двух скриптов »

Цитата:

Цитата habib2302
и я тебя прошу.объедени мне пожалуйста эти два скрипта »

Дак я уже объединил их, что там ещё объединять то?
Немного подправил
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: 1.ico; DestDir: {app}; Flags: ignoreversion
Source: 2.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AIDA641}\*; DestDir: {app}\{#AIDA641}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}\{#AIDA642}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов                                       

[Icons]
Name: {group}\{#AIDA641}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{#AIDA641}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{#AIDA642}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\2.ico;
Name: {group}\{#AIDA641}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\{#AIDA642}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\{#AIDA641}\Справка {#AIDA641}; Filename: {app}\{#AIDA641}\aida64.chm; Components: AIDA641;
Name: {group}\{#AIDA642}\Справка {#AIDA642}; Filename: {app}\{#AIDA642}\aida64.chm; Components: AIDA642;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;

[Run]
Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

[Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!
const
  RT_RCDATA = 10;

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
  finally
    lResStream.Free;
    Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#AIDA641}'
else
if IsComponentSelected('AIDA642') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#AIDA642}';
end;

procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#AIDA641}'
else
if IsComponentSelected('AIDA642') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#AIDA642}';
end;

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
  Result:=True;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
  with WizardForm do
  begin
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  gdipShutdown;
  TaskBarDestroy;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030106402000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167651453656C656374436F6D706F6E656E7473506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED0000F110544E6577436865636B4C697374426F780E436F6D706F6E656E74734C69737403546F70023206486569676874039B000B4578706C69636974546F7002320E4578706C69636974486569676874039B000000F10C544E6577436F6D626F426F780A5479706573436F6D626F0A4974656D486569676874020D00000000000000


Правда один момент мне непонятный:
Код:

Source: {app}\{#AIDA641}\*; DestDir: {app}\{#AIDA641}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}\{#AIDA642}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;

откуда будут браться файлы для установки? Константа {app} - "Папка, куда устанавливается приложение. Она выбирается пользователем в окне Выбор папки назначения при установке."

habib2302 08-04-2013 14:35 2128230

подскажите пожалуйста.как скрыть страницу ReadyPage?
я пытался скрыть эту страницу добавив в процедуру InitializeWizard этот код WizardForm.ReadyPage.Hide; но к сажелению эффекта нет

nik1967 08-04-2013 14:44 2128242

habib2302, держи. Вроде всё корректно работает.


Код:

[Setup]
DisableReadyPage=yes

и
Код:

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  ------------------------
  wpSelectTasks:
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

Весь скрипт
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppVersionName "AIDA64 v.2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppVersionName}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no
AppendDefaultDirName=no
AppendDefaultGroupName=no
DisableReadyPage=yes

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: 1.ico; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: 2.ico; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: {app}\{#AIDA641}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\2.ico;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\Справка {#AIDA641}; Filename: {app}\aida64.chm; Components: AIDA641;
Name: {group}\Справка {#AIDA642}; Filename: {app}\aida64.chm; Components: AIDA642;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;

[Run]
Filename: {app}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

[Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!
const
  RT_RCDATA = 10;

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
  finally
    lResStream.Free;
    Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#AIDA641}'
else
if IsComponentSelected('AIDA642') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#AIDA642}';
end;

procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#AIDA641}'
else
if IsComponentSelected('AIDA642') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#AIDA642}';
end;

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
  Result:=True;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
  with WizardForm do
  begin
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
  wpSelectTasks:
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  gdipShutdown;
  TaskBarDestroy;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;


habib2302 08-04-2013 15:06 2128259

nik1967, помоги мне пожалуйста скрыть страницу ReadyPage

saurn 08-04-2013 15:09 2128260

Цитата:

Цитата habib2302
WizardForm.ReadyPage.Hide; но к сажелению эффекта нет »

И не будет. Для некоторых страниц существует возможность отключения через секцию Setup. Например, для ReadyPage:
Код:

[Setup]
DisableReadyPage=yes

Есть так же специальная функция ShouldSkipPage в Code, например, если необходимо пропустить несколько страниц, в рамках некоего условия. Пример:

Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case
PageID of
   
wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady: Result := True;
  end;
end;


nik1967 08-04-2013 15:19 2128266

Цитата:

Цитата habib2302
nik1967, помоги мне пожалуйста скрыть страницу ReadyPage »

Смотри выше

Nightwishh 08-04-2013 17:34 2128355

saurn, Спасибо за помощь! а посмотрите я для GroupEdit я правильно сделал?
Код:

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

[ Code]
var
  PathLabel: TLabel;

function PathCompactPathEx(pszOut: String; pszSrc: String; cchMax: UINT; dwFlags: DWORD): BOOL;
  external 'PathCompactPathExA@shlwapi.dll stdcall';

function ShortPath(Input: String; Length: Integer): String;
begin
  Result := StringOfChar(#32, 260);
  PathCompactPathEx(Result, Input, Length, 0);
end;

procedure GroupEditOnChange(Sender: TObject);
begin
  PathLabel.Caption := ShortPath('' + #32 + TEdit(Sender).Text, 55);
end;

procedure InitializeWizard();
begin
  PathLabel := TLabel.Create(WizardForm);
  with PathLabel do
  begin
    Parent:= WizardForm.SelectProgramGroupPage;
    Caption := ShortPath('' + #32 + WizardForm.GroupEdit.Text, 55);
    Transparent := True;
    Font.Size := 9;
    Left := WizardForm.DirEdit.Left;
    Top := WizardForm.DirEdit.Top + Round((WizardForm.DirEdit.Height - Height) div 2);
  end;
  WizardForm.GroupEdit.OnChange := @GroupEditOnChange;
  WizardForm.GroupEdit.Hide;
end;

[Icons]
Name: {group}\1; Filename: {app}\fjhjk.exe; WorkingDir: {app}; Flags: createonlyiffileexists


neorom 08-04-2013 18:40 2128387

Цитата:

Цитата saurn
в чем сложность? Скрипт покажите. »

У меня в скрипте нету прописано процентов (попрасту я собераюсь прописать проценти туда, а не получаэться(бо неумею, а хотелось би)).
Цитата:

Цитата saurn
Ну и, если хочется проценты через внешнюю библиотеку »

Да хочу, но чтоби проценти возрастали при возрастании процес бара, а не получаэться.

audiofeel 08-04-2013 23:33 2128539

помогите добавить к имени (mytext.txt) и пароль , пробовал дублировать ошибок нет но и результата тоже нет - одно имя.
Код:

[.....Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program

[...Code]
var
EditPage: TWizardPage;
MyEdit, MyEdit1: TEdit;

procedure MyEditOnChange(Sender: TObject);
begin
  if MyEdit.Text = '' then
  WizardForm.NextButton.Enabled := False
  else
  WizardForm.NextButton.Enabled := True;
end;

procedure MyEdit1OnChange(Sender: TObject);
begin
  if MyEdit1.Text = '' then
  WizardForm.NextButton.Enabled := False
  else
  WizardForm.NextButton.Enabled := True;
end;

procedure CreateEditPage();
begin
  EditPage := CreateCustomPage(wpWelcome, 'Введите данные учетной записи ЦРУ', '');

  with TNewStaticText.Create(EditPage) do
  begin
    SetBounds(10,25,100,14);
    Caption := 'Введите свой ник:';
    Parent := EditPage.Surface;
  end;

  with TNewStaticText.Create(EditPage) do
  begin
    SetBounds(10,65,100,14);
    Caption := 'Введите пароль:';
    Parent := EditPage.Surface;
  end;

  MyEdit := TEdit.Create(EditPage);
  with MyEdit do
  begin
    SetBounds(10, 44, 350, 21);
    OnChange := @MyEditOnChange;
    Parent  := EditPage.Surface;
  end;

  MyEdit1 := TEdit.Create(EditPage);
  with MyEdit1 do
  begin
    SetBounds(10, 84, 350, 21);
    OnChange := @MyEdit1OnChange;
    Parent  := EditPage.Surface;
  end;
end;

procedure InitializeWizard();
begin
  CreateEditPage();
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall: SaveStringToFile(ExpandConstant('{app}')+'\durdom.ini', MyEdit.Text, true);
  end;
  case CurStep of
    ssPostInstall: SaveStringToFile(ExpandConstant('{app}')+'\durdom.ini', MyEdit1.Text, true);
  end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
  if (CurPageID = EditPage.ID) and (MyEdit.Text = '') and (MyEdit1.Text = '')then
  WizardForm.NextButton.Enabled := False;
end;


saurn 09-04-2013 07:19 2128666

audiofeel,

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

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
CurStep of
   
ssPostInstall:
    begin
     
SaveStringToFile(ExpandConstant('{app}')+'\durdom.ini', MyEdit.Text + #13#10, true);
      SaveStringToFile(ExpandConstant('{app}')+'\durdom.ini', MyEdit1.Text, true);
    end;
  end;
end;


///P.S.////////////////////////////////////////////////////////////////////////////////////////////////////////////

//ssPostInstall: это шаг установки (CurStep: TSetupStep) объявлять его дважды, по меньшей мере не имеет смысла.
//Если у вас несколько задач, выполняющихся на этапах установки, пишите так:
//
//procedure CurStepChanged(CurStep: TSetupStep);
//begin
//  case CurStep of
//    ssInstall:
//    begin
//      действие 1;
//      действие 2;
//      и т.д.
//    end;
//    ssPostInstall:
//    begin
//      действие 1;
//      действие 2;
//      и т.д.
//    end;
//  end;
//end;
//
//Если не понятны действия с case, пишите, как привыкли:
//procedure CurStepChanged(CurStep: TSetupStep);
//begin
//if CurStep = ssPostInstall then
//...
//
//В данном случае больше сила привычки, нежели необходимость.



Цитата:

Цитата Nightwishh
Спасибо за помощь! а посмотрите я для GroupEdit я правильно сделал? »

Мне не за что, пример не мой.
Пару мелочей пропустили. Так будет правильно:
читать дальше »
Код:

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

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

const
 
MAX_PATH = 260;
  MAX_PATH_LEN = 55;

var
 
PathLabel: TLabel;

function PathCompactPathEx(pszOut: String; pszSrc: String; cchMax: UINT; dwFlags: DWORD): BOOL; external 'PathCompactPathEx{#A}@shlwapi.dll stdcall';

function ShortPath(Input: String; Length: Integer): String;
begin
 
Result := StringOfChar(#32, 260);
  PathCompactPathEx(Result, Input, Length, 0);
end;

procedure GroupEditOnChange(Sender: TObject);
begin
 
PathLabel.Caption := ShortPath(#32 + TEdit(Sender).Text, 55);
end;

procedure InitializeWizard();
begin
 
PathLabel := TLabel.Create(nil);
  with PathLabel do
  begin
   
Parent:= WizardForm.SelectProgramGroupPage;
    Caption := ShortPath(#32 + WizardForm.GroupEdit.Text, 55);
    Transparent := True;
    Font.Size := 9;
    Left := WizardForm.GroupEdit.Left;
    Top := WizardForm.GroupEdit.Top + Round((WizardForm.GroupEdit.Height - Height) div 2);
  end;
  WizardForm.GroupEdit.OnChange := @GroupEditOnChange;
  WizardForm.GroupEdit.Hide;
end;

[Icons]
Name: {group}\1; Filename: {app}\fjhjk.exe; WorkingDir: {app}; Flags: createonlyiffileexists



Цитата:

Цитата neorom
Да хочу, но чтоби проценти возрастали при возрастании процес бара, а не получаэться. »

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

neorom 09-04-2013 18:57 2129159

Прошу, кто панимаєт , удалите из єтого скрипта всьо лишниэ, лишить надо только процедуру отображения процентов, без процес бара(шрифт, розмещения, цвет - оставить)
читать дальше »
#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
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;

Nightwishh 09-04-2013 18:58 2129161

И последний вопрос по поваду GroupEdit.
Код:

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

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

const
  MAX_PATH = 260;
  MAX_PATH_LEN = 55;

var
  PathLabel: TLabel;

function PathCompactPathEx(pszOut: String; pszSrc: String; cchMax: UINT; dwFlags: DWORD): BOOL; external 'PathCompactPathEx{#A}@shlwapi.dll stdcall';

function ShortPath(Input: String; Length: Integer): String;
begin
  Result := StringOfChar(#32, 260);
  PathCompactPathEx(Result, Input, Length, 0);
end;

procedure GroupEditOnChange(Sender: TObject);
begin
  PathLabel.Caption := ShortPath(#32 + TEdit(Sender).Text, 55);
end;

procedure InitializeWizard();
begin
  PathLabel := TLabel.Create(nil);
  with PathLabel do
  begin
    Parent:= WizardForm.SelectProgramGroupPage;
    Caption := ShortPath(#32 + WizardForm.GroupEdit.Text, 55);
    Transparent := True;
    Font.Size := 9;
    Left := WizardForm.GroupEdit.Left;
    Top := WizardForm.GroupEdit.Top + Round((WizardForm.GroupEdit.Height - Height) div 2);
  end;
  WizardForm.GroupEdit.OnChange := @GroupEditOnChange;
  WizardForm.GroupEdit.Hide;
end;

[Icons]
Name: {group}\1; Filename: {app}\fjhjk.exe; WorkingDir: {app}; Flags: createonlyiffileexists

1)Как сделать неактивным PathLabel чекбоксом NoIconsCheck?
2)И можно ли убрать
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

, у меня версия компилятора Ansi? Спасибо!

habib2302 09-04-2013 19:08 2129176

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

saurn 09-04-2013 19:27 2129188

Цитата:

Цитата Nightwishh
Как сделать неактивным PathLabel чекбоксом NoIconsCheck? »

Можно. Вставьте в свой скрипт:
Код:

procedure NoIconsOnClick(Sender: TObject);
begin
 
PathLabel.Enabled := not TCheckBox(Sender).Checked;
  WizardForm.GroupBrowseButton.Enabled := PathLabel.Enabled;
end;

procedure InitializeWizard();
begin
 
WizardForm.NoIconsCheck.OnClick := @NoIconsOnClick;
end;

Цитата:

Цитата Nightwishh
И можно ли убрать »

читать дальше »
Могу ошибатся, но вроде это связано с обращением к API. Препроцессор вместо имени команды подставляет имя функции с суффиксом W(для unicode) или A(для однобайтовых). Пример будет безошибочно работать в обоих версиях компилятора. Убирать не нужно.

Nightwishh 09-04-2013 20:26 2129223

saurn, Спасибо всё понял, пошёл собирать. :)

habib2302 09-04-2013 20:52 2129241

мне кто нибудь ответит на мое сообщение???

insombia 09-04-2013 22:57 2129333

habib2302 в смысле старую версию?

habib2302 09-04-2013 23:02 2129335

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

Johny777 10-04-2013 01:29 2129403

habib2302,
Цитата:

Цитата habib2302
подскажите.как сделать чтобы перед установкой новой версии экзешник сначало удалял старую версию,а потом начинал установку новой версии »

раз уж пакуешь Аиду то неплохо бы удалить и офф. версии программы а не только свою. На их сайте нашёл 2 версии, и их апп-айди записал в константы
APPID_AIDA_EXTREME
APPID_AIDA_BUISNES
принцип работы кода такой:
1. в функцию GetUninstallPath() отправляем заполненный вручную массив записей апп-айди (в примере ниже 2 вышеупомянутых, включая тот что у твоего инсталла). Она возвращает
массив записей, в каждом элементе которого путь к экзешнику деинсталлятора для каждой программы, если он был найден
2. Если пользователь соглашается на вопрос месседжбокса об удалении найденных программ, то мы отправляем полученный массив путей в процедуру UninstallApps(), которая с ожиданием (спасибо примеру Serega - "ExecAndWait.iss" из шапки ), то бишь по-очереди вызывает деинсталяторы
3. Твой инсталл запустится только если повторный (через рекурсивный вызов ф-ции InitializeSetup() ) вызов функции GetUninstallPath() после пункта 1 и 2 вернёт массив длиной = 0
код:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

AppId=TheBestAidaInstallEver

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

const
   
APPID_AIDA_EXTREME = 'AIDA64 Extreme Edition';
    APPID_AIDA_BUISNES = 'AIDA64 Business Edition';

    WAIT_OBJECT_0 = $0;
    STARTF_USESHOWWINDOW  = 1;
    NORMAL_PRIORITY_CLASS = $00000020;
    INFINITE = $FFFFFFFF;    { Infinite timeout }

type
   
_STARTUPINFO = record
       
cb: DWORD;
        #ifdef UNICODE
           
lpReserved, lpDesktop, lpTitle: PAnsiChar;
        #else
           
lpReserved, lpDesktop, lpTitle: PChar;
        #endif
       
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
        wShowWindow, cbReserved2: Word;
        lpReserved2: Byte;
        hStdInput, hStdOutput, hStdError: THandle;
    end;

    _PROCESS_INFORMATION = record
       
hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif


function GetUninstallPath(const AppIds: array of String): array of String;
var
   
StringList: TStringList;
    i, Len: Integer;
    Buff: String;
begin
    for
i := 0 to GetArrayLength(AppIds)-1 do
    begin
       
Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
        if Buff <> '' then
        begin
           
Len := GetArrayLength(Result);
            SetArrayLength(Result, Len+1);
            Result[Len] := Buff;
        end;
    end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
   
pi: _PROCESS_INFORMATION;
    si: _STARTUPINFO;
    i: Integer;
begin
    for
i := 0 to GetArrayLength(UninstallPathes)-1 do
    begin
       
si.cb := SizeOf(si);
        si.dwFlags := STARTF_USESHOWWINDOW;
        si.wShowWindow := SW_SHOWNORMAL;
        #ifdef UNICODE
       
if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
       
#else
       
if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
       
#endif
       
begin
           
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
            Exit;
        end;
        try
            while
WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
        finally
           
CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        end;
    end;
end;


function InitializeSetup(): Boolean;
var
   
i, Len: Integer;
    uArray: array of String;
begin
   
uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES] );
    Len := GetArrayLength(uArray);
    Result := Len = 0;
    if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
    begin
       
UninstallApps(uArray);
        Result := InitializeSetup();
    end;
end;


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

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

AppId=TheBestAidaInstallEver



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

const
   

    WAIT_OBJECT_0 = $0;
    STARTF_USESHOWWINDOW  = 1;
    NORMAL_PRIORITY_CLASS = $00000020;
    INFINITE = $FFFFFFFF;    { Infinite timeout }

type
   
_STARTUPINFO = record
       
cb: DWORD;
        #ifdef UNICODE
           
lpReserved, lpDesktop, lpTitle: PAnsiChar;
        #else
           
lpReserved, lpDesktop, lpTitle: PChar;
        #endif
       
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
        wShowWindow, cbReserved2: Word;
        lpReserved2: Byte;
        hStdInput, hStdOutput, hStdError: THandle;
    end;

    _PROCESS_INFORMATION = record
       
hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif


function UninstallMyApp(): Boolean;
var
   
pi: _PROCESS_INFORMATION;
    si: _STARTUPINFO;
    Buff: String;
    i: Integer;
begin
    if
MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDNO then Exit;
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
    Result := Buff = '';
    if not Result then
    begin
       
si.cb := SizeOf(si);
        si.dwFlags := STARTF_USESHOWWINDOW;
        si.wShowWindow := SW_SHOWNORMAL;
        #ifdef UNICODE
       
if not CreateProcess('', PAnsiChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
       
#else
       
if not CreateProcess('', PChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
       
#endif
       
begin
           
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
            Exit;
        end;
        try
            while
WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
        finally
           
CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
            Result := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}')) = '';
        end;
    end;
end;


function InitializeSetup(): Boolean;
begin
   
Result := UninstallMyApp();
end;


habib2302 10-04-2013 09:42 2129541

Johny777, я вставил первый скрипт и при компиляции ошибок нету,но при установке выдает ошибку.вот скрины

может что то я не так сделал?вот скрипт
читать дальше »
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no
AppendDefaultDirName=no
AppendDefaultGroupName=no
LicenseFile=license.txt
DisableReadyPage=yes
AppId=TheBestAidaInstallEver

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: license.txt; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: 1.ico; DestDir: {app}; Flags: ignoreversion
Source: 2.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AIDA641}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\2.ico;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\Справка {#AIDA641}; Filename: {app}\aida64.chm; Components: AIDA641;
Name: {group}\Справка {#AIDA642}; Filename: {app}\aida64.chm; Components: AIDA642;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;

[Run]
Filename: {app}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

[.Code]

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!
const
  RT_RCDATA = 10;
    APPID_AIDA_EXTREME = 'AIDA64 Extreme Edition';
    APPID_AIDA_BUISNES = 'AIDA64 Business Edition';

    WAIT_OBJECT_0 = $0;
    STARTF_USESHOWWINDOW  = 1;
    NORMAL_PRIORITY_CLASS = $00000020;
    INFINITE = $FFFFFFFF;    { Infinite timeout }

type
    _STARTUPINFO = record
        cb: DWORD;
        #ifdef UNICODE
            lpReserved, lpDesktop, lpTitle: PAnsiChar;
        #else
            lpReserved, lpDesktop, lpTitle: PChar;
        #endif
        dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
        wShowWindow, cbReserved2: Word;
        lpReserved2: Byte;
        hStdInput, hStdOutput, hStdError: THandle;
    end;

    _PROCESS_INFORMATION = record
        hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif


function GetUninstallPath(const AppIds: array of String): array of String;
var
    StringList: TStringList;
    i, Len: Integer;
    Buff: String;
begin
    for i := 0 to GetArrayLength(AppIds)-1 do
    begin
        Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
        if Buff <> '' then
        begin
            Len := GetArrayLength(Result);
            SetArrayLength(Result, Len+1);
            Result[Len] := Buff;
        end;
    end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
    pi: _PROCESS_INFORMATION;
    si: _STARTUPINFO;
    i: Integer;
begin
    for i := 0 to GetArrayLength(UninstallPathes)-1 do
    begin
        si.cb := SizeOf(si);
        si.dwFlags := STARTF_USESHOWWINDOW;
        si.wShowWindow := SW_SHOWNORMAL;
        #ifdef UNICODE
        if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #else
        if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #endif
        begin
            MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
            Exit;
        end;
        try
            while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
        finally
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        end;
    end;
end;

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
 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;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
  finally
    lResStream.Free;
    Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
end;

procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
end;

function InitializeSetup:boolean;
var
    i, Len: Integer;
    uArray: array of String;
begin
    uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES] );
    Len := GetArrayLength(uArray);
    Result := Len = 0;
    if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
  Result:=True;
      begin
        UninstallApps(uArray);
        Result := InitializeSetup();
    end;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
    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;
  with WizardForm do
  begin
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
  wpSelectTasks:
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  gdipShutdown;
  TaskBarDestroy;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;


или можно сделать так.допустим.у меня установлен компанент AIDA64 Business Edition и я также захотел установить второй компанент т.е AIDA64 Extreme Edition.и можно как нибудь заблокировать RadioButton второго компанента при повторной установке

habib2302 11-04-2013 10:23 2130248

мне кто нибудь ответит на мое сообщение?

Gnom_aka_Lexander 11-04-2013 10:37 2130257

habib2302, на глазок по экстрасенсорному наитию - ты пытаешься задействовать botva2.dll,но она у тебя не прописана в файлах и отсутствует в инсталле, отсюда рантайм эррор и ошибка обращения к несуществующему объекту.

habib2302 11-04-2013 10:55 2130268

Gnom_aka_Lexander, или можно сделать так.допустим.у меня установлен компанент AIDA64 Business Edition и я также захотел установить второй компанент т.е AIDA64 Extreme Edition.и при повторной установке можно как нибудь заблокировать RadioButton второго компанента?

saurn 11-04-2013 13:02 2130336

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

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no
AppendDefaultDirName=no
AppendDefaultGroupName=no
LicenseFile=license.txt
DisableReadyPage=yes
AppId=TheBestAidaInstallEver

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: license.txt; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: 1.ico; DestDir: {app}; Flags: ignoreversion
Source: 2.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AIDA641}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\2.ico;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\Справка {#AIDA641}; Filename: {app}\aida64.chm; Components: AIDA641;
Name: {group}\Справка {#AIDA642}; Filename: {app}\aida64.chm; Components: AIDA642;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;

[Run]
Filename: {app}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

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

const
 
RT_RCDATA            = 10;
  APPID_AIDA_EXTREME    = 'AIDA64 Extreme Edition';
  APPID_AIDA_BUISNES    = 'AIDA64 Business Edition';

  WAIT_OBJECT_0 = $0;
  STARTF_USESHOWWINDOW  = 1;
  NORMAL_PRIORITY_CLASS = $00000020;
  INFINITE              = $FFFFFFFF;

type
 
_STARTUPINFO = record
 
cb: DWORD;
  #ifdef UNICODE
   
lpReserved, lpDesktop, lpTitle: PAnsiChar;
  #else
   
lpReserved, lpDesktop, lpTitle: PChar;
  #endif
 
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
  wShowWindow, cbReserved2: Word;
  lpReserved2: Byte;
  hStdInput, hStdOutput, hStdError: THandle;
  end;

  _PROCESS_INFORMATION = record
 
hProcess: THandle;
  hThread: THandle;
  dwProcessId: DWORD;
  dwThreadId: DWORD;
  end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif

var
 
TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
 CheckLicense: TCheckBox;
 iInitialize: Boolean;


function GetUninstallPath(const AppIds: array of String): array of String;
var
 
StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for
i := 0 to GetArrayLength(AppIds)-1 do
  begin
   
Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
     
Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
 
pi: _PROCESS_INFORMATION;
  si: _STARTUPINFO;
  i: Integer;
begin
  for
i := 0 to GetArrayLength(UninstallPathes)-1 do
  begin
   
si.cb := SizeOf(si);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := SW_SHOWNORMAL;
    #ifdef UNICODE
     
if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
   
#else
     
if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
   
#endif
   
begin
     
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
      Exit;
    end;
    try
      while
WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
    finally
   
CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    end;
  end;
end;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
 
lResStream: TResourceStream;
begin
 
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
   
lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
 
lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

function InitializeSetup:boolean;
var
 
i, Len: Integer;
  uArray: array of String;
begin
 
uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES] );
  Len := GetArrayLength(uArray);
  Result := Len = 0;
  if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  begin
   
UninstallApps(uArray);
    Result := InitializeSetup();
  end;
end;

procedure LicenseOnClick(Sender: TObject);
begin
  case
TCheckBox(Sender).Checked of
   
True: WizardForm.LicenseAcceptedRadio.Checked := True;
    False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if
IsComponentSelected('AIDA641') then
 
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+''
else
if
IsComponentSelected('AIDA642') then
 
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
end;

procedure TFVOnChange(Sender: TObject);
begin
if
IsComponentSelected('AIDA641') then
 
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+''
else
if
IsComponentSelected('AIDA642') then
 
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
end;

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if
WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  with
WizardForm.ComponentsList do
  begin
   
Top := ScaleY(50);
    Height := ScaleY(155);
  end;
end;

procedure InitializeWizard;
begin
 
RedesignWizardForm;
  WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
  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;
  with WizardForm do
  begin
   
iInitialize := True;
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
     
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    ExtractTemporaryFile('WinTB.dll');
    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
     
Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
 
if IsComponentSelected('AIDA641') then
  begin
   
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if
IsComponentSelected('AIDA642') then
  begin
   
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
  wpSelectTasks:
  begin
   
WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  if
iInitialize then
  begin
   
gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  with
UninstallProgressForm do
    begin
      if
GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
       
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
     
Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
 
gdipShutdown;
end;



Цитата:

Цитата habib2302
и при повторной установке можно как нибудь заблокировать RadioButton второго компанента? »

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

P.S.
Вы когда скрипты объединяете, смотрите, что, куда и как вы вставляете.
А вот ваша ошибка:
Код:

if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
Result:=True;


habib2302 11-04-2013 15:38 2130429

saurn, огромное тебе спасибо!!!!!выручил ты меня!!!!!

neorom 11-04-2013 20:19 2130619

Я так вижу, все меня игнарироют !!! Ладно.

insombia 11-04-2013 21:01 2130657

neorom тебя не игнорят,прост твой вопрос бред,как могут идти проценты без прогресс бара?как ты себе это представляешь?

Mailchik 11-04-2013 21:32 2130671

Цитата:

Цитата insombia
как могут идти проценты без прогресс бара?как ты себе это представляешь? »

молча.
Цитата:

Цитата neorom
Я так вижу, все меня игнарироют !!! Ладно. »

люди хотят, чтобы вы хоть что то сделали сами. чем больше вам помогают, тем больше вы спрашиваете.
читать дальше »
Код:

#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
 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;
 #ifdef SecondProgressBar
 LabelPct2: TLabel;
 #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
 LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
 #ifdef SecondProgressBar
 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;
 LabelPct1.Hide;
 LabelCurrFileName.Hide;
 LabelTime1.Hide;
 LabelTime2.Hide;
 MyCancelButton.Hide;
 #ifdef SecondProgressBar
 LabelPct2.Hide;
 #endif
 end;

procedure CreateControls;
 var PBTop:integer;
 begin
 PBTop:=ScaleY(50);
 LabelPct1 := TLabel.Create(WizardForm);
 with LabelPct1 do begin
 Parent := WizardForm.InstallingPage;
 AutoSize := False;
 Left := ScaleX(370);
 Top := PBTop + ScaleY(2);
 Width := ScaleX(80);
 end;
 LabelCurrFileName := TLabel.Create(WizardForm);
 with LabelCurrFileName do begin
 Parent := WizardForm.InstallingPage;
 AutoSize := False;
 Width := ScaleX(395);
 Left := ScaleX(0);
 Top := ScaleY(30);
 end;
 #ifdef SecondProgressBar
 PBTop:=PBTop+ScaleY(25);
 LabelPct2 := TLabel.Create(WizardForm);
 with LabelPct2 do begin
 Parent := WizardForm.InstallingPage;
 AutoSize := False;
 Left := ScaleX(370);
 Top := PBTop + ScaleY(10);
 Width := ScaleX(80);
 end;
 #endif
 LabelTime1 := TLabel.Create(WizardForm);
 with LabelTime1 do begin
 Parent := WizardForm.InstallingPage;
 AutoSize := False;
 Width := 182;
 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 := 182;
 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}\data.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;


Nightwishh 12-04-2013 05:26 2130790

Ребят, как поставить SelectDirBitmapImage на передний план (создал BitmapImage1, а она закрывает собой SelectDirBitmapImage), допустим в этом коде
Код:

[Setup]
AppName=еоркпркр
AppVerName=нркркрк
DefaultDirName={pf}\карпапрапр

[Files]
Source: Background.bmp; Flags: dontcopy solidbreak

[ Code]
var
  BitmapImage1: TBitmapImage;

procedure InitializeWizard();
begin
  WizardForm.SelectDirBitmapImage.Top:= ScaleY(9);

  BitmapImage1 := TBitmapImage.Create(WizardForm);
  with BitmapImage1 do
  begin
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(0);
    Top := ScaleY(9);
    Width := ScaleX(305);
    Height := ScaleY(305);
    Stretch := True;
    ExtractTemporaryFile('Background.bmp');
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\Background.bmp'));
  end;
end;

Но не создавая новою картинку!
2) И в чём разница между Hide и Visible:= false? и что лучше?

Gnom_aka_Lexander 12-04-2013 08:20 2130815

Nightwishh, у большинства контролов есть свойство BringToFront, которое перемещает на передний план.
Цитата:

Цитата Nightwishh
2) И в чём разница между Hide и Visible:= false? и что лучше? »

В целом никакой. Visible является ReadWrite, тоесть как задаваемым, так и возврящаемым. иногда можно для краткости его успользовать. например, когда имеет место конструкция if(условие)then MyCtrl.Show; то быстрей будет так: MyCtrl.Visible:= (условие); По крайней мере такая конструкция на одну операцию меньше.

ABBAT 12-04-2013 16:00 2131083

Всем привет. Делаю скрипт Adobe Flash Player (вроде работает) и у меня секция InitializeSetup получилась громоздкая и соответственно долгий запуск. Может кто что посоветует.
Выкладываю полностью скрипт (может кому пригодится)
читать дальше »

Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
;#define FlashPlayerVer ""

#define FlashPlayer32 "NPSWF32_11_7_700_169.dll"
#define FlashPlayer64 "NPSWF64_11_7_700_169.dll"
#define ActiveX32 "Flash32_11_7_700_169.ocx"
#define ActiveX64 "Flash64_11_7_700_169.ocx"

#define Ver                "11,7,700,169"
#define ActiveXVer "11.7.700.169"
#define FlashPlayerVer "11.7.700.169"
#define AppVer GetFileVersion(AddBackslash(SourcePath) + 'System32\NPSWF64_11_7_700_169.dll')


#define AppName "Adobe Flash Player"
#define AppCopyright "© 1982-" + GetDateTimeString ("yyyy", "", "") + " Adobe Systems Inc."
#define AppURL "http://www.adobe.com"
#define AppDescription        "Adobe Flash Player " + AppVer + "
#define AppPub                "Adobe Systems Incorporated"
#define AppURL                "http://www.adobe.com/ru/products/flashplayer.html"






[Setup]
AppName={#AppName}
AppVersion={#AppVer}
AppPublisher={#AppCopyright}
VersionInfoDescription        = {#AppDescription}
AppCopyright={#AppCopyright}
VersionInfoVersion={#AppVer}
DefaultDirName={sys}
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=Flash
SetupIconFile=4105.ico
Compression=lzma2/ultra64
SolidCompression=true
InternalCompressLevel=ultra64
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64 x86
DisableFinishedPage=true
DisableReadyPage=true
DisableDirPage=true
DisableProgramGroupPage=true
DirExistsWarning=no
DisableStartupPrompt=yes
DisableReadyMemo=yes
RestartIfNeededByRun=no
CreateUninstallRegKey=no
Uninstallable=no
CompressionThreads=8
LZMAUseSeparateProcess=yes
LZMANumBlockThreads=4
CloseApplications=false
RestartApplications=false

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


[Files]
Source: "System32\*"; DestDir: "{sys}\Macromed\Flash"; Check: IsWin64; Flags: recursesubdirs createallsubdirs ignoreversion; BeforeInstall: CreateBackup
Source: "SysWOW64\*"; DestDir: "{syswow64}\Macromed\Flash"; Check: IsWin64; Flags: recursesubdirs createallsubdirs ignoreversion; BeforeInstall: CreateBackup
Source: "SysWOW64\*"; DestDir: "{sys}\Macromed\Flash";Check: not IsWin64; Flags: recursesubdirs createallsubdirs ignoreversion; BeforeInstall: CreateBackup
Source: "activexSysWOW64\*"; DestDir: "{sys}\Macromed\Flash";Check: not IsWin64; Flags: recursesubdirs createallsubdirs ignoreversion; BeforeInstall: CreateBackup; OnlyBelowVersion: 0,6.2
Source: "activexSysWOW64\*"; DestDir: "{syswow64}\Macromed\Flash";Check: IsWin64; Flags: recursesubdirs createallsubdirs ignoreversion; BeforeInstall: CreateBackup; OnlyBelowVersion: 0,6.2
Source: "activexX32\*"; DestDir: "{sys}\Macromed\Flash";Check: IsWin64; Flags: recursesubdirs createallsubdirs ignoreversion; BeforeInstall: CreateBackup; OnlyBelowVersion: 0,6.2
Source: "FlashPlayerCPLApp.cpl"; DestDir: "{syswow64}"; Flags: ignoreversion; Check: IsWin64; OnlyBelowVersion: 0,6.2
Source: "FlashPlayerCPLApp.cpl"; DestDir: "{sys}"; Flags: ignoreversion; Check: not IsWin64; OnlyBelowVersion: 0,6.2

Source: "{sys}\Macromed\Flash\{#ActiveX64}"; DestDir: "{sys}\Macromed\Flash"; Check: IsWin64; Flags: external ignoreversion regserver; OnlyBelowVersion: 0,6.2
Source: "{syswow64}\Macromed\Flash\{#ActiveX32}"; DestDir: "{syswow64}\Macromed\Flash"; Flags: external ignoreversion regserver; OnlyBelowVersion: 0,6.2

Source: "FlashPlayerApp.exe"; DestDir: "{sys}"; Check: not IsWin64; Flags: ignoreversion;
Source: "FlashPlayerApp.exe"; DestDir: "{syswow64}"; Check: IsWin64; Flags: ignoreversion;


Source: "Uninstall.exe"; DestDir: "{sys}\Macromed\Flash"; Flags:  ignoreversion

[InstallDelete]
Name: "{sys}\Macromed\*"; Type: filesandordirs
Name: "{syswow64}\Macromed\*"; Type: filesandordirs; Check: IsWin64;


[Registry]
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer; ValueType: string; ValueName: CurrentVersion; ValueData: {#Ver}; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerActiveX; ValueType: string; ValueName: Version; ValueData: {#ActiveXVer}; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerActiveX; ValueType: string; ValueName: PlayerPath; ValueData: {sys}\Macromed\Flash\{#ActiveX64}; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: Version; ValueData: {#AppVer}; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: PlayerPath; ValueData: {sys}\Macromed\Flash\{#FlashPlayer64}; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: UninstallerPath; ValueData: {sys}\Macromed\Flash\Uninstall.exe; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Path; ValueData:{sys}\Macromed\Flash\{#FlashPlayer64}; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: ProductName; ValueData: Adobe® Flash® Player {#AppVer} Plugin; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Vendor; ValueData: Adobe Systems Incorporated; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Description; ValueData: Adobe® Flash® Player {#AppVer} Plugin; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Version; ValueData: {#AppVer}; Check: IsWin64;

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: DisplayName; ValueData: Adobe Flash Player 11 ActiveX & Plugin 64-bit; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: Publisher; ValueData: Adobe Systems Incorporated; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: DisplayVersion; ValueData: {#AppVer}; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: HelpLink; ValueData: http://www.adobe.com/go/flashplayer_support/ ; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: dword; ValueName: NoModify; ValueData: $00000001; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: dword; ValueName: NoRepair; ValueData: $00000001; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: URLInfoAbout; ValueData: http://www.adobe.com ; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: URLUpdateInfo; ValueData: http://www.adobe.com/go/getflashplayer/ ; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: UninstallString; ValueData: {sys}\Macromed\Flash\Uninstall.exe -maintain; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: DisplayIcon; ValueData: {sys}\Macromed\Flash\Uninstall.exe; Check: IsWin64; OnlyBelowVersion: 0,6.2

Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayer; ValueType: string; ValueName: CurrentVersion; ValueData: {#Ver}; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayerActiveX; ValueType: string; ValueName: Version; ValueData: {#ActiveXVer}; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayerActiveX; ValueType: string; ValueName: PlayerPath; ValueData: {syswow64}\Macromed\Flash\{#ActiveX32}; Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: Version; ValueData: {#AppVer}; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: PlayerPath; ValueData: {syswow64}\Macromed\Flash\{#FlashPlayer32}; Check: IsWin64;
;Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayerPlugin\Components; ValueType: string; ValueName: Main; ValueData: 1; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayerPlugin; ValueName: isScriptDebugger; ValueData: 00000000; ValueType: dword; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: ProductName; ValueData: Adobe® Flash® Player {#AppVer} Plugin; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Path; ValueData: {syswow64}\Macromed\Flash\{#FlashPlayer32}; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Vendor; ValueData: Adobe Systems Incorporated; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Description; ValueData: Adobe® Flash® Player {#AppVer} Plugin; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Version; ValueData: {#AppVer}; Check: IsWin64;
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: XPTPath; ValueData: {syswow64}\Macromed\Flash\flashplayer.xpt; Check: IsWin64;
Root: HKCU; SubKey: Software\Macromedia\FlashPlayer; ValueType: string; ValueName: FlashPlayerVersion; ValueData: "{#ActiveXVer}~installVector=1"; OnlyBelowVersion: 0,6.2
;_____________________________________________________________________________________________________

Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer; ValueType: string; ValueName: CurrentVersion; ValueData: {#Ver};Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerActiveX; ValueType: string; ValueName: Version; ValueData: {#ActiveXVer};Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerActiveX; ValueType: string; ValueName: Path; ValueData: {sys}\Macromed\Flash;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerActiveX; ValueType: string; ValueName: PlayerPath; ValueData: {sys}\Macromed\Flash\{#ActiveX32};Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin\Components; ValueType: string; ValueName: Main; ValueData: 1;Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: Version; ValueData: {#AppVer};Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: PlayerPath; ValueData: {sys}\Macromed\Flash\{#FlashPlayer32};Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin; ValueType: string; ValueName: Path; ValueData: {sys}\Macromed\Flash\{#FlashPlayer32};Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayerPlugin; ValueName: isScriptDebugger; ValueData: 00000000; ValueType: dword; Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Path; ValueData: {sys}\Macromed\Flash\{#FlashPlayer32};Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: ProductName; ValueData: Adobe® Flash® Player {#AppVer} Plugin;Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Vendor; ValueData: Adobe Systems Incorporated;Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Description; ValueData: Adobe® Flash® Player {#AppVer} Plugin;Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: Version; ValueData: {#AppVer};Check: not IsWin64;
Root: HKLM; SubKey: SOFTWARE\MozillaPlugins\@adobe.com/FlashPlayer; ValueType: string; ValueName: XPTPath; ValueData: {sys}\Macromed\Flash\flashplayer.xpt;Check: not IsWin64;

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: DisplayName; ValueData: Adobe Flash Player 11 ActiveX & Plugin;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: Publisher; ValueData: Adobe Systems Incorporated;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: DisplayVersion; ValueData: {#AppVer};Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: HelpLink; ValueData: http://www.adobe.com/go/flashplayer_support/ ;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: dword; ValueName: NoModify; ValueData: $00000001;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: dword; ValueName: NoRepair; ValueData: $00000001;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: RequiresIESysFile; ValueData: 4.70.0.1155;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: URLInfoAbout; ValueData: http://www.adobe.com ;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: URLUpdateInfo; ValueData: http://www.adobe.com/go/getflashplayer/ ;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: dword; ValueName: VersionMajor; ValueData: $0000000b;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: dword; ValueName: VersionMinor; ValueData: $00000000;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: UninstallString; ValueData: {sys}\Macromed\Flash\Uninstall.exe -maintain ;Check: not IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX; ValueType: string; ValueName: DisplayIcon; ValueData: {sys}\Macromed\Flash\Uninstall.exe ;Check: not IsWin64; OnlyBelowVersion: 0,6.2
; win 8
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: DisplayName; ValueData: Adobe Flash Player 11 Plugin ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: Publisher; ValueData: Adobe Systems Incorporated; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: DisplayVersion; ValueData: {#AppVer}; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: HelpLink; ValueData: http://www.adobe.com/go/flashplayer_support/ ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: dword; ValueName: NoModify; ValueData: $00000001; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: dword; ValueName: NoRepair; ValueData: $00000001; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: RequiresIESysFile; ValueData: 4.70.0.1155; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: URLInfoAbout; ValueData: http://www.adobe.com ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: URLUpdateInfo; ValueData: http://www.adobe.com/go/getflashplayer/ ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: dword; ValueName: VersionMajor; ValueData: $0000000b ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: dword; ValueName: VersionMinor; ValueData: $00000007 ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: UninstallString; ValueData: {sys}\Macromed\Flash\Uninstall.exe -maintain plugin ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: string; ValueName: DisplayIcon; ValueData: {sys}\Macromed\Flash\Uninstall.exe ; MinVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin; ValueType: dword; ValueName: EstimatedSize; ValueData: $00001800; MinVersion: 0,6.2

Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 6.0; ValueData: $ffffffff ;Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 7.0; ValueData: $ffffffff ;Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 8.0; ValueData: $ffffffff ;Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 9.0; ValueData: $ffffffff ;Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 10.0; ValueData: $00e6001e ;Check: IsWin64; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Wow6432Node\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 11.0; ValueData: $02bc00a9 ;Check: IsWin64; OnlyBelowVersion: 0,6.2

Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 6.0; ValueData: $ffffffff; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 7.0; ValueData: $ffffffff; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 8.0; ValueData: $ffffffff; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 9.0; ValueData: $ffffffff; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 10.0; ValueData: $00e6001e; OnlyBelowVersion: 0,6.2
Root: HKLM; SubKey: SOFTWARE\Macromedia\FlashPlayer\SafeVersions; ValueType: dword; ValueName: 11.0; ValueData: $02bc00a9; OnlyBelowVersion: 0,6.2



[_code]

var
  ResultStr:string;
  ResultCode: Integer;
  Mask: string;

function FindFileByMask(Path, Mask: 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;
var
  ErCode: Integer;
begin
    Exec('taskkill', '/f /im iexplore.exe', '', SW_HIDE, ewWaitUntilTerminated, ErCode);
    Exec('taskkill', '/f /im firefox.exe', '', SW_HIDE, ewWaitUntilTerminated, ErCode);
    ExtractTemporaryFile('Uninstall.exe');

begin
  if ((GetWindowsVersion shr 24) <= 6) and (((GetWindowsVersion shr 16) and $FF) <= 1)
  then begin
  if FindFileByMask(ExpandConstant('{sys}\Macromed\Flash'), 'NPSWF*.dll') = True then begin//MsgBox('ok', mbInformation, MB_OK);
//  ExtractTemporaryFile('Uninstall.exe');
  Exec(ExpandConstant('{tmp}\Uninstall.exe'), '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end
  if FindFileByMask(ExpandConstant('{sys}\Macromed\Flash'), 'NPSWF*.dll') = True then begin
  Result := False;
  exit;
 end else
  Result := True;
 
  if IsWin64 then
  begin
  if FindFileByMask(ExpandConstant('{syswow64}\Macromed\Flash'), 'NPSWF*.dll') = True then begin
//  ExtractTemporaryFile('Uninstall.exe');
  Exec(ExpandConstant('{tmp}\Uninstall.exe'), '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end;
  if  FindFileByMask(ExpandConstant('{syswow64}\Macromed\Flash'), 'NPSWF*.dll') = True then begin
  Result := False;
  exit;
 end else
  Result := True;
  end;
 begin
  if FindFileByMask(ExpandConstant('{sys}\Macromed\Flash'), '*.ocx') = True then begin//MsgBox('ok', mbInformation, MB_OK);
//  ExtractTemporaryFile('Uninstall.exe');
  Exec(ExpandConstant('{tmp}\Uninstall.exe'), '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end
  if FindFileByMask(ExpandConstant('{sys}\Macromed\Flash'), '*.ocx') = True then begin
  Result := False;
  exit;
 end else
  Result := True;
 end;
  begin
  if IsWin64 then
  begin
  if FindFileByMask(ExpandConstant('{syswow64}\Macromed\Flash'), '*.ocx') = True then begin
//  ExtractTemporaryFile('Uninstall.exe');
  Exec(ExpandConstant('{tmp}\Uninstall.exe'), '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end;
  if  FindFileByMask(ExpandConstant('{syswow64}\Macromed\Flash'), '*.ocx') = True then begin
  Result := False;
  exit;
 end else
  Result := True;
  end;
 end;
 end;
end;
 begin
  if ((GetWindowsVersion shr 24) >= 6) and (((GetWindowsVersion shr 16) and $FF) >= 2)
  then begin
  if FindFileByMask(ExpandConstant('{sys}\Macromed\Flash'), 'NPSWF*.dll') = True then begin//MsgBox('ok', mbInformation, MB_OK);
//  ExtractTemporaryFile('Uninstall.exe');
  Exec(ExpandConstant('{tmp}\Uninstall.exe'), '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end
  if FindFileByMask(ExpandConstant('{sys}\Macromed\Flash'), 'NPSWF*.dll') = True then begin
  Result := False;
  exit;
 end else
  Result := True;
 
  if IsWin64 then
  begin
  if FindFileByMask(ExpandConstant('{syswow64}\Macromed\Flash'), 'NPSWF*.dll') = True then begin
//  ExtractTemporaryFile('Uninstall.exe');
  Exec(ExpandConstant('{tmp}\Uninstall.exe'), '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end;
  if  FindFileByMask(ExpandConstant('{syswow64}\Macromed\Flash'), 'NPSWF*.dll') = True then begin
  Result := False;
  exit;
 end else
  Result := True;
      end;
  end;
 end;
end;
   

procedure CreateBackup;
var
  srcFile, destFile: string;
begin
  srcFile:= ExpandConstant(CurrentFileName);
  destFile:= srcFile + '.bak';
  DeleteFile(destFile);
  RenameFile(srcFile, destFile);
end;

procedure InitializeWizard();
begin
 with WizardForm do SetBounds(-Left*5, -Top*5, Width, Height);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
 PostMessage(WizardForm.NextButton.Handle, 245, 0, 0);
end;


Johny777 12-04-2013 20:24 2131250

ABBAT,
1. было слишком много логических скобок begin end;
2. лишние глобальные переменные и тяжёлая функция поиска по маске
3. не вдавался в значение кода, просто переписал, удалил лишнее и оптимизировал
4. используй по возможности const во входных параметрах функций/процедур, тк стек не резиновый
5. чтоб не гонять лишний раз функцию ExpandConstant() лучше 1 раз записать повторяющиеся пути в переменные,
короче изучай:


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

function FindFileByExt(const SearchPath, Extension: String): Boolean;
var
   
FindRec: TFindRec;
begin
    try
       
Result := FindFirst(AddBackslash(RemoveBackslash(SearchPath)) + Extension, FindRec);
    finally
       
FindClose(FindRec);
    end;
end;

function InitializeSetup(): Boolean;
var
   
Syswow64Path, SysPath, TempPath: String;
    ErrorCode: Integer;
    WinVersion: Cardinal;
begin
    if
MsgBox('Для установки будут закрыты браузеры если они открыты. Продолжить?', mbConfirmation, MB_YESNO) = IDNO then Exit;

    Exec('taskkill', '/f /im iexplore.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
    Exec('taskkill', '/f /im firefox.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
    ExtractTemporaryFile('Uninstall.exe');

    Syswow64Path := AddBackslash(RemoveBackslash(ExpandConstant('{syswow64}')));
    SysPath := AddBackslash(RemoveBackslash(ExpandConstant('{sys}')));
    TempPath := AddBackslash(RemoveBackslash(ExpandConstant('{tmp}')));
    WinVersion := GetWindowsVersion;

    if ((WinVersion shr 24) <= 6) and (((WinVersion shr 16) and $FF) <= 1) then
    begin
        if
FindFileByExt(SysPath + 'Macromed\Flash', 'NPSWF*.dll') then Exec(TempPath + 'Uninstall.exe', '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
        Result := not FindFileByExt(SysPath + 'Macromed\Flash', 'NPSWF*.dll');
        if not Result then Exit;
        if IsWin64 then
        begin
            if
FindFileByExt(Syswow64Path + 'Macromed\Flash', 'NPSWF*.dll') then Exec(TempPath + 'Uninstall.exe', '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
            Result := not FindFileByExt(Syswow64Path + 'Macromed\Flash', 'NPSWF*.dll');
            if not Result then Exit;

            if FindFileByExt(Syswow64Path + 'Macromed\Flash', '*.ocx') then Exec(TempPath + 'Uninstall.exe', '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
            Result := not FindFileByExt(Syswow64Path + 'Macromed\Flash', '*.ocx');
            if not Result then Exit;
        end;
        if FindFileByExt(SysPath + 'Macromed\Flash', '*.ocx') then  Exec(TempPath + 'Uninstall.exe', '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
        Result := not FindFileByExt(SysPath + 'Macromed\Flash', '*.ocx');
        if not Result then Exit;
    end else if ((WinVersion shr 24) >= 6) and (((WinVersion shr 16) and $FF) >= 2) then
    begin
        if
FindFileByExt(SysPath + 'Macromed\Flash', 'NPSWF*.dll') then Exec(TempPath + 'Uninstall.exe', '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
        Result := not FindFileByExt(SysPath + 'Macromed\Flash', 'NPSWF*.dll');
        if not Result then Exit;
        if IsWin64 then
        begin
            if
FindFileByExt(Syswow64Path + 'Macromed\Flash', 'NPSWF*.dll') then Exec(TempPath + 'Uninstall.exe', '-maintain', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode);
            Result := not FindFileByExt(Syswow64Path + 'Macromed\Flash', 'NPSWF*.dll');
        end;
    end;
end;



PS: делай нормальные отступы чтоб было читабельно и тебе и другим (лучший пример El Sanchez)
Некрасиво убивать процесс барузера не спросив или не предупредив пользователя! А вдруг там что-то скачивается?

neorom 12-04-2013 20:35 2131264

З процентами я розобрался на 99.9%. Остался последний вопрос.
Например, чтоби при просмотре замисть 67% било 67.0% (проценти 67.1% єсть )на екране процентов зделать так
Додаю скрипт
читать дальше »
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: innocallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: files\*; DestDir: {app}; Flags: recursesubdirs

[code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
TimerID: 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 PercentsInstall();
begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Установка игры: ' + NumToStr((Position*100)/Max) + ' %';
end;
end;

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
if WizardForm.CurPageID = wpInstalling then PercentsInstall();
End;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.DirEdit.Left;
Top:= WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(30);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Alignment := taCenter;
Font.Style:= [fsBold, fsItalic];
Font.Size:= 14;
Font.Name:= 'Times New Roman';
Font.Color:= ClMaroon;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
TimerID:= SetTimer(0, 0, 500 {Установка игры}, WrapTimerProc(@MyTimerProc, 4));
end;
end;

ABBAT 12-04-2013 22:02 2131327

Johny777,
Спасибо дружище. Хороший код, но, если нажать на отмену, то установщик 4 раза предлагает удалить и только патом закрывается. (есть идеи как обойти?)
Цитата:

Цитата Johny777
Некрасиво убивать процесс барузера не спросив или не предупредив пользователя! А вдруг там что-то скачивается? »

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

Johny777 12-04-2013 22:49 2131367

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

ABBAT 13-04-2013 00:31 2131431

Johny777,
Спасибо большое вроде все как надо работает (на Win8 не тестил)
Файлы я беру в ветке "Наборы обновлений для Windows..." тема FullFlash аддон 'mPaSoft' он Flash в 7z пакует.
(я бы может и не парился но у него он такой страшный, в 7z батники, файлы реестра. (удивляюсь как это все работает, но работает же ыыы))
Вот скрипт со всем необходимым для создания аддона Adobe Flash Player 11 ActiveX & Plugin
Спасибо Johny777 за помощь.

habib2302 13-04-2013 14:48 2131638

люди.я незнаю как это вам объяснить.короче.помогите мне пожалуйста разделить мне мой скрипт от AIDA64 на части.например.1 часть это кликабельное лого без фона,2 часть wizardimage и wazardsmallimage без фона,3 часть это поменять местами страницы Select dir и select components и т.п.а то я запутался в своем скрипте.вот скрипт
читать дальше »
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no
AppendDefaultDirName=no
AppendDefaultGroupName=no
LicenseFile=license.txt
DisableReadyPage=yes
AppId=TheBestAidaInstallEver

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: license.txt; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: 1.ico; DestDir: {app}; Flags: ignoreversion
Source: 2.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AIDA641}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\2.ico;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\Справка {#AIDA641}; Filename: {app}\aida64.chm; Components: AIDA641;
Name: {group}\Справка {#AIDA642}; Filename: {app}\aida64.chm; Components: AIDA642;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;

[Run]
Filename: {app}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

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

const
  RT_RCDATA            = 10;
  APPID_AIDA_EXTREME    = 'AIDA64 Extreme Edition';
  APPID_AIDA_BUISNES    = 'AIDA64 Business Edition';

  WAIT_OBJECT_0 = $0;
  STARTF_USESHOWWINDOW  = 1;
  NORMAL_PRIORITY_CLASS = $00000020;
  INFINITE              = $FFFFFFFF;

type
  _STARTUPINFO = record
  cb: DWORD;
  #ifdef UNICODE
    lpReserved, lpDesktop, lpTitle: PAnsiChar;
  #else
    lpReserved, lpDesktop, lpTitle: PChar;
  #endif
  dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
  wShowWindow, cbReserved2: Word;
  lpReserved2: Byte;
  hStdInput, hStdOutput, hStdError: THandle;
  end;

  _PROCESS_INFORMATION = record
  hProcess: THandle;
  hThread: THandle;
  dwProcessId: DWORD;
  dwThreadId: DWORD;
  end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
 CheckLicense: TCheckBox;
 iInitialize: Boolean;


function GetUninstallPath(const AppIds: array of String): array of String;
var
  StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for i := 0 to GetArrayLength(AppIds)-1 do
  begin
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
      Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
  pi: _PROCESS_INFORMATION;
  si: _STARTUPINFO;
  i: Integer;
begin
  for i := 0 to GetArrayLength(UninstallPathes)-1 do
  begin
    si.cb := SizeOf(si);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := SW_SHOWNORMAL;
    #ifdef UNICODE
      if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #else
      if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #endif
    begin
      MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
      Exit;
    end;
    try
      while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
    finally
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    end;
  end;
end;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
  lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

function InitializeSetup:boolean;
var
  i, Len: Integer;
  uArray: array of String;
begin
  uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES] );
  Len := GetArrayLength(uArray);
  Result := Len = 0;
  if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  begin
    UninstallApps(uArray);
    Result := InitializeSetup();
  end;
end;

procedure LicenseOnClick(Sender: TObject);
begin
  case TCheckBox(Sender).Checked of
    True: WizardForm.LicenseAcceptedRadio.Checked := True;
    False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
end;

procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
end;

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
  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;
  with WizardForm do
  begin
    iInitialize := True;
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    ExtractTemporaryFile('WinTB.dll');
    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
  wpSelectTasks:
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  if iInitialize then
  begin
    gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;


saurn 13-04-2013 19:12 2131772

habib2302, А взять по отдельности примеры из которых скрипт собрали, не?


Renko13 13-04-2013 19:51 2131794

Доброго всем, товарищи. Не подскажете, в Inno Setup возможна реализация запуска файла до того как инсталлятор начнет копировать файлы ?. Т.е. Запустил инсталлятор - указал путь, нажал далее, и тут то он сначала выполняет запуск файла и дожидается его окончания работы. а потом приступает к копированию того что надо

habib2302 13-04-2013 20:07 2131807

saurn, просто в мой скрипт вносились изменения

Mailchik 13-04-2013 20:21 2131818

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

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

[Code]
function NextButtonClick(CurPageID: Integer): Boolean;
var
 ResultCode: integer;
 begin
  if CurPageID = wpSelectDir then begin
  Exec(ExpandConstant('{src}\test.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  Result := True
  end else
  Result := True;
end;
//ExpandConstant('{src}\test.exe') --- запускаемое приложение.
//SW_HIDE --- запустить в скрытом режиме
//ewWaitUntilTerminated --- дождаться завершения работы приложения


Renko13 13-04-2013 20:24 2131823

Mailchik

Благодарю :) :)

neorom 13-04-2013 21:15 2131851

Помогите !!! Или дале игнорируэте меня !!! Остался последний вопрос.
Например, чтоби при просмотре замисть 67% било 67.0% (проценти 67.1% єсть )на екране процентов зделать так
Додаю скрипт
читать дальше »
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: innocallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: files\*; DestDir: {app}; Flags: recursesubdirs

[code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
TimerID: 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 PercentsInstall();
begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Установка игры: ' + NumToStr((Position*100)/Max) + ' %';
end;
end;

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
if WizardForm.CurPageID = wpInstalling then PercentsInstall();
End;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.DirEdit.Left;
Top:= WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(30);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Alignment := taCenter;
Font.Style:= [fsBold, fsItalic];
Font.Size:= 14;
Font.Name:= 'Times New Roman';
Font.Color:= ClMaroon;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
TimerID:= SetTimer(0, 0, 500 {Установка игры}, WrapTimerProc(@MyTimerProc, 4));
end;
end;

Mailchik 13-04-2013 21:53 2131882

neorom,
Код:

procedure PercentsInstall();
 begin
 with WizardForm.ProgressGauge do begin
  PercentsLabel.Caption := 'Установка игры: ' + NumToStr((Position*100)/Max) + '.' + Chr(48 + Position mod 10) + ' %';
 end;
end;


saurn 13-04-2013 22:14 2131907

habib2302, не разделил, но подписал комментарии, где там что к чему относится. Разберетесь.
читать дальше »
Код:

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

const
///////////////////////////////////Относится к лого и изображениям мастера
 
RT_RCDATA            = 10;
 
///////////////////////////////////Удаление других приложений при старте
 
APPID_AIDA_EXTREME    = 'AIDA64 Extreme Edition';
  APPID_AIDA_BUISNES    = 'AIDA64 Business Edition';

  WAIT_OBJECT_0 = $0;
  STARTF_USESHOWWINDOW  = 1;
  NORMAL_PRIORITY_CLASS = $00000020;
  INFINITE              = $FFFFFFFF;

type

///////////////////////////////////Удаление других приложений при старте
 
_STARTUPINFO = record
 
cb: DWORD;
  #ifdef UNICODE
   
lpReserved, lpDesktop, lpTitle: PAnsiChar;
  #else
   
lpReserved, lpDesktop, lpTitle: PChar;
  #endif
 
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
  wShowWindow, cbReserved2: Word;
  lpReserved2: Byte;
  hStdInput, hStdOutput, hStdError: THandle;
  end;

  _PROCESS_INFORMATION = record
 
hProcess: THandle;
  hThread: THandle;
  dwProcessId: DWORD;
  dwThreadId: DWORD;
  end;
//////////////////////////////

///////////////////////////////////Удаление других приложений при старте
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif
///////////////////////////////
var
///////////////////////////////////Дерево выбора папок
 
TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
///////////////////////////////////Лого и изображения
 
lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
///////////////////////////////////////////
 
CheckLicense: TCheckBox;
 iInitialize: Boolean;


///////////////////////////////////Удаление других приложений при старте
function GetUninstallPath(const AppIds: array of String): array of String;
var
 
StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for
i := 0 to GetArrayLength(AppIds)-1 do
  begin
   
Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
     
Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;


///////////////////////////////////Удаление других приложений при старте
procedure UninstallApps(const UninstallPathes: array of String);
var
 
pi: _PROCESS_INFORMATION;
  si: _STARTUPINFO;
  i: Integer;
begin
  for
i := 0 to GetArrayLength(UninstallPathes)-1 do
  begin
   
si.cb := SizeOf(si);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := SW_SHOWNORMAL;
    #ifdef UNICODE
     
if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
   
#else
     
if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
   
#endif
   
begin
     
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
      Exit;
    end;
    try
      while
WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
    finally
   
CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    end;
  end;
end;
//////////////////////////////////////////

///////////////////////////////////Ресурсы(относится к лого и изображениям мастера)
function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
 
lResStream: TResourceStream;
begin
 
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
   
lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
 
lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

function InitializeSetup:boolean;

///////////////////////////////////Удаление других приложений при старте
var
 
i, Len: Integer;
  uArray: array of String;
begin
 
uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES] );
  Len := GetArrayLength(uArray);
  Result := Len = 0;
  if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  begin
   
UninstallApps(uArray);
    Result := InitializeSetup();
  end;
/////////////////////////////////////
end;

///////////////////////////////////Обработчик чекбокса лицензионного соглашения
procedure LicenseOnClick(Sender: TObject);
begin
  case
TCheckBox(Sender).Checked of
   
True: WizardForm.LicenseAcceptedRadio.Checked := True;
    False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;
//////////////////////////

///////////////////////////////////Дерево выбора папки установки
procedure TDVOnChange(Sender: TObject);
begin
if
IsComponentSelected('AIDA641') then
 
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+''
else
if
IsComponentSelected('AIDA642') then
 
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
end;
////////////////////////////////

///////////////////////////////////Дерево выбора папки программ
procedure TFVOnChange(Sender: TObject);
begin
if
IsComponentSelected('AIDA641') then
 
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+''
else
if
IsComponentSelected('AIDA642') then
 
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
end;
//////////////////

///////////////////////////////////Смена страниц местами
function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if
WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;
//////////////////

procedure RedesignWizardForm;
begin
  with
WizardForm.ComponentsList do
  begin
   
Top := ScaleY(50);
    Height := ScaleY(155);
  end;
end;

procedure InitializeWizard;
begin
 
RedesignWizardForm;
  WizardForm.TypesCombo.hide;
 
///////////////////////////////////Смена страниц местами
 
PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
/////////////////
 
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;
  with WizardForm do
  begin
 
///////////////////////////////////Логотип и изображения мастера
   
iInitialize := True;
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
///////////////////////////////////Изображения
     
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);
////////////////////////////////////////////

///////////////////////////////////Логотип

     
lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;
///////////////////////////////////

///////////////////////////////////WinTB
   
ExtractTemporaryFile('WinTB.dll');
    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
//////////////////////////////////////

   
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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
     
Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
//////////////////////////////////////////////////////

///////////////////////////////////Смена папки установки в зависимости от компонента
   
 
if IsComponentSelected('AIDA641') then
  begin
   
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if
IsComponentSelected('AIDA642') then
  begin
   
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
///////////////////////////////////////////////////////
 
 
wpSelectTasks:
  begin
   
WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  if
iInitialize then
  begin
   
gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  with
UninstallProgressForm do
    begin
///////////////////////////////////Логотип и изображения мастера
     
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
///////////////////////////////////Изображения
       
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);
       
///////////////////////////////////Логотип
       
lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
     
Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
 
gdipShutdown;
end;

////////////////Если что пропустил, извиняйте - времени мало.


neorom 13-04-2013 22:29 2131914

Mailchik не роботаэт. Пишет что эсть какаэто ошибка.

alert30 13-04-2013 23:27 2131954

neorom, а какая ошибка? Скрынчык дай хоть бы...

Костя_Антонов@fb 14-04-2013 00:05 2131970

Может кто помочь, суть в том что стут
Код:

DefaultDirName={reg:HKLM\"Путь к ключу в реестре",(запятая) "КлючЭ}
А что делать если в пути к ключу реестра уже есть запятая. и он не считывает пусть, так как берёт за ключ все что после первой запятой....

saurn 14-04-2013 00:36 2131984

Костя_Антонов@fb

Код:

[Setup]
DefaultDirName={code:GetPreviousDir}

[Code]
function GetPreviousDir(AppInstallDir: String): String;
begin
  if
RegKeyExists(HKLM, 'SOFTWARE\My,Program') then
  begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\My,Program', 'InstallLocation', AppInstallDir);
    Result := RemoveBackslash(AppInstallDir);
  end else
   
Result := ExpandConstant('{pf}\My Program')
end;


Костя_Антонов@fb 14-04-2013 00:49 2131988

Спасибо за помощь

audiofeel 14-04-2013 02:35 2132009

"Доброй" ночи всем. подскажите , посаветуйте в чем разница между этими двумя "примерами"
Код:

procedure InitializeWizard();
begin
  DirectX := TCheckBox.Create(WizardForm);
  With DirectX  do begin
    Parent  := WizardForm;
    Cursor  := crHand;
    TabOrder := 0;
    Checked  := False;
    SetBounds(50,166,15,15);
 end;                                                                                                                                       

и вот этим
procedure InitializeWizard();
begin
  DirectX := TCheckBox.Create(WizardForm);
  DirectX.Parent  := WizardForm;
  DirectX.Cursor  := crHand;
  DirectX.TabOrder := 0;
  DirectX.SetBounds(50,166,15,15);
  DirectX.Checked  := False;
end;

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

Nightwishh 14-04-2013 04:32 2132026

Подскажите, как перенести текст из "WizardForm.ComponentsDiskSpaceLabel" и "WizardForm.FinishedLabel" на Label? Пробовал через
Код:

Label1.Caption:= WizardForm.ComponentsDiskSpaceLabel.Caption и
Label2.Caption:= WizardForm.FinishedLabel.Caption

получается просто звёздочка на лейбле.
2) и что лучше
Код:

SetBounds(ScaleX(23), ScaleY(102), ScaleX(150), ScaleY(22)); или
Left:= ScaleX(23);
Top:= ScaleY(102);
Width:= ScaleX(150);
Height:= ScaleY(22);

Спасибо!

audiofeel 14-04-2013 04:46 2132029

Nightwishh, Я делаю вот так, пробуй
Код:

Label1.Caption:= SetupMessage(msgComponentsDiskSpaceMBLabel);
Label2.Caption:= SetupMessage(msgFinishedLabel);


neorom 14-04-2013 07:02 2132053

Цитата:

Цитата alert30
а какая ошибка? Скрынчык дай хоть бы... »

Фото

saurn 14-04-2013 11:17 2132141

Цитата:

Цитата audiofeel
"Доброй" ночи всем. подскажите , посаветуйте в чем разница между этими двумя "примерами" »

Я обычно использую первый вариант, когда для контрола требуется задать много параметров - это избавляет от лишней писанины. И вторым вариантом, если требуется изменить какой-то один параметр. А насчет быстроты, не знаю, ни разу не обращал внимания.
Кстати, координаты лучше указывать вот так:
Код:

SetBounds(ScaleX(50), ScaleY(166), ScaleX(15), ScaleY(15));
В чем разница? Просто, координаты указаные без ScaleX, ScaleY будут являтся фактическими, и могут быть различные проблемы с отображением контролов, особенно, если в системе установлен размер текста не по умолчанию. Из-за не правильного указания координат обычно и возникают проблемы, типа: кнопка лежит не там, где задумано, текст вруг уехал в сторону и т.д. А так координаты контролов будут задаватся согласно размеру клиента.

Цитата:

Цитата Nightwishh
и что лучше »

Первый вариант. Хотя бы тем, что сокращает колличество строк с четырех до одной.

neorom
Пробел потеряли.
Код:

PercentsLabel.Caption := 'Установка игры: ' + NumToStr((Position*100)/Max) + '.' + Chr(48 + Position mod{вот тут пробела нехватает}10) + ' %';

neorom 14-04-2013 12:47 2132213

Тепер эсть так но не получаэтсь так

Johny777 14-04-2013 13:14 2132224

Костя_Антонов@fb, saurn, (не забываем const AppInstallDir... во входных параметрах!), вот апдейт функции
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
AppId=123

DefaultDirName={code:GetPreviousDir}

[Code ]
function GetPreviousDir(const AppInstallDir: String): String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', Result);
    if Result <> '' then RemoveBackslash(Result) else Result := ExpandConstant('{pf}\My Program');
end;



заместо функции GetPreviousDir(...) проще всего получить пред. путь так:
читать дальше »
Код:

AppName=My Program
AppVerName=My Program v.1.2

AppId=proto15
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\Source Engine 15}
//DefaultDirName={reg:HKCU\Software\Valve\Steam,SourceModInstallPath|{pf}\valve\steam\SteamApps\SourceMods\Lost Coast}


тут 2 примера (верхний дал когда-то El Sanchez, а нижний выдрал для примера отсюда http://members.home.nl/albartus/issi...cript-1.07.iss ), каждая директива разделена |. Короче говоря, если первого пути который мы получаем из ключа reg:HKCU\Software\Valve\Steam , а в нём из записи SourceModInstallPath вернётся пустая строка '', то будет выведен путь справа от |, те путь по умолчанию
======================================================================

neorom, исправил, улучшил, замени у себя всю секцию кода на эту:

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

type
 
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
 
var
 
TimerID: 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';

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
  if
WizardForm.CurPageID = wpInstalling then with WizardForm.ProgressGauge do PercentsLabel.Caption:= Format('%s'#32'%s', ['Установка игры:', FormatFloat('0.0 %', (Position*100)/Max)]);
End;

procedure DeinitializeSetup();
begin
 
KillTimer(0, TimerID);
end;

procedure InitializeWizard();
begin
 
PercentsLabel:= TLabel.Create(WizardForm);
  with PercentsLabel do
  begin
   
Left:= WizardForm.DirEdit.Left;
    Top:= ScaleY(WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 30);
    Width:= WizardForm.StatusLabel.Width;
    Height:= WizardForm.StatusLabel.Height;
    AutoSize:= False;
    Transparent := True;
    Alignment := taCenter;
    Font.Style:= [fsBold, fsItalic];
    Font.Size:= 14;
    Font.Name:= 'Times New Roman';
    Font.Color:= ClMaroon;
    Parent:= WizardForm.InstallingPage;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if
CurStep = ssInstall then TimerID:= SetTimer(0, 0, 500 {Установка игры}, WrapTimerProc(@MyTimerProc, 4));
end;


GolD18 14-04-2013 13:17 2132227

Вложений: 1
Здравствуйте. Не видно надпись снизу. Один квадратик остался. Что изменить надо?
читать дальше »
const
Color = clblack;

procedure InitializeWizard2();
begin
WizardForm.Font.Color:=clLime;
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:=clblack;
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.WelcomeLabel1.Font.Color:=clLime;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clLime;
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.PageNameLabel.Font.Color:=clLime;
WizardForm.Bevel.visible:=False;
WizardForm.BeveledLabel.visible:=False;
WizardForm.Bevel1.visible:=False;
end;

saurn 14-04-2013 13:17 2132228

Johny777, спасибо за исправления.
Цитата:

Цитата Johny777
заместо функции GetPreviousDir(...) проще всего получить пред. путь так »

Этот вариант там как раз и не работал, из-за запятой в имени раздела.

neorom 14-04-2013 14:30 2132260

Цитата:

Цитата Johny777
замени у себя всю секцию кода на эту »

Заменил я у себя всю секцию кода, но тепер пишет при компиляции Unknown identifier 'FormatFloat'

saurn 14-04-2013 14:41 2132265

neorom, Компилировать нужно на расширенной версии от китайцев. Тем более, что: ISTool давным-давно устарело и большинство параметров не знает.

Nightwishh 14-04-2013 16:08 2132330

audiofeel, Честно говоря,
Цитата:

Цитата audiofeel
Я делаю вот так, пробуй »

не получилось, "Текущий выбор требует не менее [mb] МБ на диске" и "Программа [Name] установлена на Ваш компьютер. Приложение можно запустить бла, бла, бла"

audiofeel 14-04-2013 19:26 2132479

Nightwishh,
Цитата:

Цитата Nightwishh
не получилось »

ну попробуй сделать так; добавь
Код:

[Languages]
Name: ru; MessagesFile: compiler:Default.isl
[Messages]
ru.ComponentsDiskSpaceMBLabel=Текущий выбор требует не менее *****МБ на диске // и укажи сколько места требуется сам
ru.FinishedLabel=Программа ******* установлена на Ваш компьютер.  // здесь тоже пиши что хочешь


saurn 14-04-2013 20:14 2132506

Nightwishh, audiofeel,
Код:

Label1.Caption := WizardForm.ComponentsDiskSpaceLabel.Caption;

Цитата:

Цитата GolD18
Здравствуйте. Не видно надпись снизу. Один квадратик остался. Что изменить надо? »

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

const
Color = clblack;

procedure InitializeWizard();
begin
 
WizardForm.Font.Color:=clLime;
  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:=clblack;
  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.WelcomeLabel1.Font.Color:=clLime;
  WizardForm.InfoBeforeClickLabel.Color:=Color;
  WizardForm.MainPanel.Color:=Color;
  WizardForm.PageNameLabel.Color:=Color;
  WizardForm.PageDescriptionLabel.Color:=Color;
  WizardForm.ReadyLabel.Color:=Color;
  WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
  WizardForm.FinishedHeadingLabel.Font.Color:=clLime;
  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.PageNameLabel.Font.Color:=clLime;
  WizardForm.Bevel.Hide;
  WizardForm.BeveledLabel.Hide;
  WizardForm.Bevel1.Hide;

  WizardForm.NoIconsCheck.Width := ScaleY(16)

  with TLabel.Create(nil) do
  begin
   
Parent:= WizardForm.SelectProgramGroupPage;
    SetBounds(WizardForm.NoIconsCheck.Left + 18, WizardForm.NoIconsCheck.Top + 2, 0, 0)
    AutoSize:= True;
    Transparent := True;
    Font.Color := clLime;
    Caption := SetupMessage(msgNoProgramGroupCheck2);
  end;
end;


Nightwishh 15-04-2013 03:31 2132751

Здравствуйте. Нужна помощь. При запуске инсталла выдаёт такую ошибку "could not call proc"
Код:

#define NeedSize 4380
#define NeedInstallSize 78900

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

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

var
  PathLabel, TotalSpaceLabel, FreeSpaceLabel, NeedSpacelabel, InstallSpaceLabel: TLabel;
  FreeMB, TotalMB: Cardinal;
  Drive: String;

function PathCompactPathEx(pszOut: String; pszSrc: String; cchMax: UINT; dwFlags: DWORD): BOOL;
  external 'PathCompactPathEx{#A}@shlwapi.dll stdcall';

function ShortPath(Input: String; Length: Integer): String;
begin
  Result := StringOfChar(#32, 260);
  PathCompactPathEx(Result, Input, Length, 0);
end;

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 MbOrTb(Float: Extended): String;
begin
  if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
    if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
      Result:= NumToStr(Float/(1024*1024))+' Тб';
end;

procedure DirEditOnChange(Sender: TObject);
begin
  Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
  TotalSpaceLabel.Caption:= 'Всего места на диске: '+MbOrTb(TotalMB);
  FreeSpaceLabel.Caption:= 'Доступно места на диске: '+MbOrTb(FreeMB)+' ('+IntToStr(round(FreeMB*100/TotalMB))+'%)';
  InstallSpacelabel.Caption:= 'Требуется места для установки: '+MbOrTb({#NeedInstallSize});
  NeedSpaceLabel.Caption:= 'Требуется места на диске: '+MbOrTb({#NeedSize});
  WizardForm.NextButton.Enabled:= (FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize});
  PathLabel.Caption := ShortPath('Install Path:' + #32 + TEdit(Sender).Text, 55);
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    PathLabel := TLabel.Create(WizardForm)
    with PathLabel do
    begin
      Parent := DirEdit.Parent;
      Caption := ShortPath('Install Path:' + #32 + DirEdit.Text, 55);
      Transparent := True;
      Font.Size := 10;
      Left := DirEdit.Left;
      Top := DirEdit.Top + Round((DirEdit.Height - Height) div 2);
    end;
    DirEdit.OnChange := @DirEditOnChange;
    DirEdit.Hide;
  end;
  TotalSpaceLabel:= TLabel.Create(WizardForm);
  TotalSpaceLabel.AutoSize:= False;
  TotalSpaceLabel.SetBounds(0, 120, 300, 20);
  TotalSpaceLabel.Parent:= WizardForm.SelectDirpage;

  FreeSpaceLabel:= TLabel.Create(WizardForm);
  FreeSpaceLabel.AutoSize:= False;
  FreeSpaceLabel.SetBounds(0, 140, 300, 20);
  FreeSpaceLabel.Parent:= WizardForm.SelectDirpage;

  InstallSpacelabel:= TLabel.Create(WizardForm);
  InstallSpacelabel.AutoSize:= False;
  InstallSpacelabel.SetBounds(0, 160, 300, 20);
  InstallSpacelabel.Parent:= WizardForm.SelectDirpage;

  NeedSpaceLabel:= TLabel.Create(WizardForm);
  NeedSpaceLabel.AutoSize:= False;
  NeedSpaceLabel.SetBounds(0, 180, 300, 20);
  NeedSpaceLabel.Parent:= WizardForm.SelectDirpage;
end;

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

Всему виной вот эта строчка
Код:

PathLabel.Caption := ShortPath('Install Path:' + #32 + TEdit(Sender).Text, 55);
Моя фантазия небольшая и что со строкой делать я незнаю...

GolD18 15-04-2013 04:21 2132754

saurn, Спасибо. Вставил ваш код и при компиляции выдает ошибку. Вот полностью мой код. Только цвет текста уже белый.


читать дальше »
[code]
const
dURL=2;

var
URLLabel,URLLabelShadow:TLabel;


procedure URLLabelClick(Sender: TObject);
var
ErrorCode:integer;
begin
ShellExec('open','http://Сайт/','','',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;

procedure InitializeWizard1;
begin
URLLabelShadow:=TLabel.Create(WizardForm);
with URLLabelShadow do begin
Top:=ScaleY(331);
Left:=ScaleX(25);
Caption:='http://Сайт/';
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://Сайт/';
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;
WizardForm.TypesCombo.ItemIndex:=0;
end;

const
Color = clblack;

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.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.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;

procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
end;


Mailchik 15-04-2013 06:45 2132770

Цитата:

Цитата Nightwishh
При запуске инсталла выдаёт такую ошибку "could not call proc" »

Код:

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

Вместо nil прописываете WizardForm.DirEdit. Или же:
Код:

PathLabel.Caption := ShortPath('Install Path:' + #32 + WizardForm.DirEdit.Text, 55);
Вместо TEdit(Sender).Text прописываете WizardForm.DirEdit.Text, но лучше первый вариант.

Nightwishh 15-04-2013 08:38 2132805

Mailchik, Спасибо большое, всё работает!

saurn 15-04-2013 11:58 2132898

Цитата:

Цитата GolD18
Вставил ваш код и при компиляции выдает ошибку. »

По возможности, прикрепляйте скрин окна с ошибкой, или хотябы описание ошибки. Так будет проще и быстрее понять, что вы сделали не так.
Вообщем, вот код:
читать дальше »
Код:

const
 
dURL  = 2;
  Color  = clblack;

var
 
URLLabel, URLLabelShadow: TLabel;
  ResultCode: Integer;

procedure URLLabelClick(Sender: TObject);
begin
 
ShellExec('open', 'http://Сайт/', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
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.Hide;
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.Show;
end;

procedure InitializeWizard();
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.TypesCombo.ItemIndex := 0;
  WizardForm.WelcomeLabel1.Color := Color;
  WizardForm.InfoBeforeClickLabel.Color := Color;
  WizardForm.MainPanel.Color := Color;
  WizardForm.PageNameLabel.Color := Color;
  WizardForm.PageDescriptionLabel.Color := Color;
  WizardForm.ReadyLabel.Color := Color;
  WizardForm.FinishedLabel.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.FinishedHeadingLabel.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.NoIconsCheck.Width := ScaleY(16)
 
  URLLabelShadow := TLabel.Create(nil);
  with URLLabelShadow do
  begin
   
Parent := WizardForm;
    SetBounds(ScaleX(25), ScaleY(331), 0, 0);
    AutoSize := True;
    Transparent := True;
    Font.Color := $969696;
    Font.Height := -12;
    Font.Style := Font.Style + [fsBold];
    Caption := 'http://Сайт/';
  end;

  URLLabel := TLabel.Create(nil);
  with URLLabel do
  begin
   
Parent := WizardForm;
    SetBounds(ScaleX(25) - dURL, ScaleY(331) - dURL, 0, 0);
    AutoSize := True;
    Transparent := True;
    Cursor := crHand;
    Font.Color := clMaroon;
    Font.Height := -12;
    Font.Style := Font.Style + [fsBold];
    Caption := 'http://Сайт/';
    BringToFront;
    OnClick := @URLLabelClick;
    OnMouseDown := @URLLabelMouseDown;
    OnMouseUp := @URLLabelMouseUp;
  end;

  with TLabel.Create(nil) do
  begin
   
Parent:= WizardForm.SelectProgramGroupPage;
    SetBounds(WizardForm.NoIconsCheck.Left + 18, WizardForm.NoIconsCheck.Top + 2, 0, 0)
    AutoSize:= True;
    Transparent := True;
    Font.Color := clWhite;
    Caption := SetupMessage(msgNoProgramGroupCheck2);
  end;
end;


Shiz 15-04-2013 20:23 2133238

Добрый день. Есть такой код:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  // Меняем размеры страницы установки
  if CurPageID=wpInstalling then begin
    WizardForm.MainPanel.Visible:=False;
    WizardForm.Bevel1.Visible:=False;
    WizardForm.Bevel.Visible:=False;
    WizardForm.Width:=ScaleX(625);
    WizardForm.Height:=ScaleY(474);
    WizardForm.Position:=poScreenCenter;
    WizardForm.InnerNotebook.Left:=ScaleX(10);
    WizardForm.InnerNotebook.Top:=ScaleY(0);
    WizardForm.InnerNotebook.Width:=ScaleX(600);
    WizardForm.InnerNotebook.Height:=ScaleY(60);
    WizardForm.OuterNotebook.Width:=ScaleX(625);
    WizardForm.OuterNotebook.Height:=ScaleX(80);
    WizardForm.PageNameLabel.Visible:=True;
    WizardForm.PageNameLabel.BringToFront;
    WizardForm.PageNameLabel.Left:=ScaleX(85);
    WizardForm.PageNameLabel.Top:=ScaleY(10);
    WizardForm.StatusLabel.Left:=ScaleX(85);
    WizardForm.StatusLabel.Top:=ScaleY(30);
    WizardForm.FileNameLabel.Left:=ScaleX(85);
    WizardForm.FileNameLabel.Top:=ScaleY(45);
    WizardForm.FileNameLabel.Width:=ScaleX(515);
    WizardForm.ProgressGauge.Left:=ScaleX(10);
    WizardForm.ProgressGauge.Top:=ScaleY(65);
    WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
    WizardForm.ProgressGauge.Height:=ScaleY(10);
    InitProgressBar(WizardForm.Handle, WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top, WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height, 100, clgray, clwhite);
    WizardForm.CancelButton.Left:=ScaleX(10);
    WizardForm.CancelButton.Top:=ScaleY(7);
  end else if CurPageID=wpFinished then begin
  //Возврат в исходное
    WizardForm.PageNameLabel.Left:=ScaleX(24);
    WizardForm.PageNameLabel.Top:=ScaleY(10);
    WizardForm.Width:=502;
    WizardForm.Height:=392;
    WizardForm.OuterNotebook.Width:=497;
    WizardForm.OuterNotebook.Height:=313;
    WizardForm.Bevel.Visible:=true;
    WizardForm.Position:=poScreenCenter;
    DeinitProgressBar();
  end
end;

Но если оставить все в таком виде, происходит некая дивная вещь. HKLM\software\microsoft\current version\uninstall не прописываются выбранные компоненты (inno setup: selected conponents) а секция эта нужна, для того, чтобы продолжить установку после перезагрузки

В то же время, если убрать первое
Код:

WizardForm.Position:=poScreenCenter;
То все становится ОК, соответствующие записи в реестра добавляются. Только тогда окно не центрируется и может не влезть в экран. Кто-нибудь может объяснить, как это вообще взаимосвязано? Или как отцентрировать окно другим способом?

Gnom_aka_Lexander 15-04-2013 20:38 2133249

Цитата:

Цитата Shiz
WizardForm.Position:=poScreenCenter; »

Эта команда пересоздает окно инсталлятора заново. Сталкивался с засадой изза этого по другому поводу, когда тоже была виновата эта команда, хотя логически с той засадой это связано не было. Можно самостоятельно зацентровать окно примерно так:
Код:

// ----- Начало - центрование формы ----- \\
function GetSystemMetrics(nIndex: Integer): Integer;
  external 'GetSystemMetrics@user32.dll stdcall';

procedure CenterForm( f : TForm);
begin
  f.Left := (GetSystemMetrics($10) - f.Width) div 2;
  f.Top := (GetSystemMetrics(17) - f.Height) div 2;
end;
// ----- Конец - центрование формы ----- \\

// Пример использования
procedure InitializeWizard();
begin
  WizardForm.Width := 1200;
  CenterForm(WizardForm);
end;


Shiz 15-04-2013 22:55 2133355

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

ilya_klimovich 15-04-2013 23:26 2133373

Здравствуйте, помогите кто, я вот запаковал фриарком игру при это разбил на 5 архивов, потом эти архивы переделал в bin файлы, где мне надо прописать эти файлы чтобы они распаковались в процессе установки.
И еще вопрос, я пробовал устанавливать свои 5 архивов с выключенным define records, у меня процент установки составил 500, но распаковалось все бес проблем, но когда я включаю define records то у меня процент составляет 100 но распаковывается только 3 архива, как сделать так чтобы распаковывались все?

audiofeel 16-04-2013 00:02 2133394

ilya_klimovich,
Цитата:

Цитата ilya_klimovich
Здравствуйте, помогите кто, я вот запаковал фриарком игру при это разбил на 5 архивов, потом эти архивы переделал в bin файлы, где мне надо прописать эти файлы чтобы они распаковались в процессе установки. »

Код:

        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
в скрипте "по умолчанию" стоит "расширение" .arc, найди строчку и поменяй на .bin (пример выше) if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.bin') на счет второго вопроса по поводу "define records" ну вот ни разу мне не "попадалось" что бы "оно" как то повлияло на количество распакованных архивов (может я не прав, пусть меня поправят) = посмотри правильно ли ты указал расширение и не запоролил ли ты архивы, а пароль вписал не верный

habib2302 16-04-2013 00:45 2133401

Доброе время суток. дайте мне пожалуйста полный скрипт на распаковку .arc архивов, учитывая выбранные компоненты.

habib2302 16-04-2013 01:07 2133413

habib2302, меня устраивает только isdone

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

saurn 16-04-2013 01:17 2133417

habib2302,
В ISDone по умолчанию задана секция на расспаковку *arc, другие секции закомментированны. Про компоненты подробно написано в справке к ISDone, более чем.
читать дальше »
Код:

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

....

Comps1:=0; Comps2:=0; Comps3:=0;
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

....

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
  repeat
    if not FileSearchInit(false) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\BasicData.arc'), ExpandConstant('{app}\'), '', false, '', '', '', notPCFonFLY) then break; //компонент без привязки
    if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 1
    if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 2
    if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 3
    if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 4
    ISDoneError:=false;
  until true;
  ISDoneStop;
end;


habib2302 16-04-2013 10:36 2133544

saurn, добавь скрипт на распаковку .arc архивов, учитывая выбранные компоненты.
вот мой скрипт
читать дальше »
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Extreme Engineer"
#define AIDA643 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AIDA64EXE3 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no
AppendDefaultDirName=no
AppendDefaultGroupName=no
LicenseFile=license.txt
DisableReadyPage=yes
AppId=TheBestAidaInstallEver

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;
Name: AIDA643; Description: {#AIDA643}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: license.txt; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: 1.ico; DestDir: {app}; Flags: ignoreversion
Source: 2.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AIDA641}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
Source: {app}\{#AIDA643}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA643;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{#AIDA643}; Filename: {app}\{#AIDA64EXE3}; Components: AIDA643;
Name: {group}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA643}}; Filename: {uninstallexe}; Components: AIDA643; IconFilename: {app}\2.ico;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA643;
Name: {group}\Справка {#AIDA641}; Filename: {app}\aida64.chm; Components: AIDA641;
Name: {group}\Справка {#AIDA642}; Filename: {app}\aida64.chm; Components: AIDA642;
Name: {group}\Справка {#AIDA643}; Filename: {app}\aida64.chm; Components: AIDA643;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {commondesktop}\{#AIDA643}; Filename: {app}\{#AIDA64EXE3}; Tasks: icons\desktop; Components: AIDA643;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA643}; Filename: {app}{#AIDA64EXE3}; Tasks: icons\quicklaunchicon; Components: AIDA643;

[Run]
Filename: {app}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;
Filename: {app}\{#AIDA64EXE3}; Description: "{cm:LaunchProgram,{#StringChange(AIDA643, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA643;

[Messages]
BeveledLabel=RePack by {#AuthRep}

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

const
  RT_RCDATA            = 10;
  APPID_AIDA_EXTREME    = 'AIDA64 Extreme Edition';
  APPID_AIDA_ENGINEER    = 'AIDA64 Extreme Engineer';
  APPID_AIDA_BUISNES    = 'AIDA64 Business Edition';

  WAIT_OBJECT_0 = $0;
  STARTF_USESHOWWINDOW  = 1;
  NORMAL_PRIORITY_CLASS = $00000020;
  INFINITE              = $FFFFFFFF;

type
  _STARTUPINFO = record
  cb: DWORD;
  #ifdef UNICODE
    lpReserved, lpDesktop, lpTitle: PAnsiChar;
  #else
    lpReserved, lpDesktop, lpTitle: PChar;
  #endif
  dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
  wShowWindow, cbReserved2: Word;
  lpReserved2: Byte;
  hStdInput, hStdOutput, hStdError: THandle;
  end;

  _PROCESS_INFORMATION = record
  hProcess: THandle;
  hThread: THandle;
  dwProcessId: DWORD;
  dwThreadId: DWORD;
  end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
 CheckLicense: TCheckBox;
 iInitialize: Boolean;


function GetUninstallPath(const AppIds: array of String): array of String;
var
  StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for i := 0 to GetArrayLength(AppIds)-1 do
  begin
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
      Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
  pi: _PROCESS_INFORMATION;
  si: _STARTUPINFO;
  i: Integer;
begin
  for i := 0 to GetArrayLength(UninstallPathes)-1 do
  begin
    si.cb := SizeOf(si);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := SW_SHOWNORMAL;
    #ifdef UNICODE
      if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #else
      if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #endif
    begin
      MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
      Exit;
    end;
    try
      while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
    finally
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    end;
  end;
end;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
  lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

function InitializeSetup:boolean;
var
  i, Len: Integer;
  uArray: array of String;
begin
  uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES, APPID_AIDA_ENGINEER] );
  Len := GetArrayLength(uArray);
  Result := Len = 0;
  if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  begin
    UninstallApps(uArray);
    Result := InitializeSetup();
  end;
end;

procedure LicenseOnClick(Sender: TObject);
begin
  case TCheckBox(Sender).Checked of
    True: WizardForm.LicenseAcceptedRadio.Checked := True;
    False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
if IsComponentSelected('AIDA643') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
end;

procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
if IsComponentSelected('AIDA643') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
end;

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
  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;
  with WizardForm do
  begin
    iInitialize := True;
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    ExtractTemporaryFile('WinTB.dll');
    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end else
  if IsComponentSelected('AIDA643') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA643}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA643}'
  end;
  end;
  wpSelectTasks:
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  if iInitialize then
  begin
    gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;


Nightwishh 16-04-2013 10:47 2133547

Добрый день! Проблемка.
Код:

[Setup]
AppName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppVerName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppPublisher=genri.sampron.iTASmania_Inc.uncle
DefaultDirName=C:\Play.MP3
OutputBaseFilename=play.mp3.by.genri.sampron.iTASmania_Inc.uncle


[Files]
Source: BASS.dll; DestDir: {tmp}; Flags: dontcopy noencryption
Source: sound.mp3; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: 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;
  MouseSiteLabel, SiteLabel: 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 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;

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')

  WizardForm.WizardBitmapImage.Parent:= WizardForm
  WizardForm.WizardBitmapImage.Height:= WizardForm.Height
  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 := 'Воспроизведение музыки'
    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 := 'Приостановить музыку'
    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 := 'Остановить музыку'
    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

    MouseSiteLabel:=TLabel.Create(WizardForm)
    MouseSiteLabel.Width:=WizardForm.Width
    MouseSiteLabel.Height:=WizardForm.Height
    MouseSiteLabel.Autosize:=False
    MouseSiteLabel.Transparent:=True
    MouseSiteLabel.OnMouseMove:= @SiteLabelMouseMove2
    MouseSiteLabel.Parent:=WizardForm

    SiteLabel:=TLabel.Create(WizardForm)
    SiteLabel.Left:=200
    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
end;

procedure DeinitializeSetup();
begin
  BASS_Stop();
  BASS_Free();
end;

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

MouseSiteLabel:=TLabel.Create(WizardForm)
    MouseSiteLabel.Width:=WizardForm.Width
    MouseSiteLabel.Height:=WizardForm.Height
    MouseSiteLabel.Autosize:=False
    MouseSiteLabel.Transparent:=True
    MouseSiteLabel.OnMouseMove:= @SiteLabelMouseMove2
    MouseSiteLabel.Parent:=WizardForm

или в
Код:

MouseLabel := TLabel.Create(WizardForm)
    MouseLabel.Width := WizardForm.Width
    MouseLabel.Height := WizardForm.Height
    MouseLabel.Autosize := False
    MouseLabel.Transparent := True
    MouseLabel.OnMouseMove := @MouseMove
    MouseLabel.Parent := WizardForm

Но я не могу понять, почему они не могут дружить друг с другом?

GolD18 16-04-2013 13:57 2133683

Вложений: 1
Помогите еще раз) С черным инсталлом стала сливаться верхняя надпись. Где изменить у нее цвет или сделать чтобы она была видна?

читать дальше »
[code]
const
dURL = 2;
Color = clblack;

var
URLLabel, URLLabelShadow: TLabel;
ResultCode: Integer;

procedure URLLabelClick(Sender: TObject);
begin
ShellExec('open', 'http://Сайт/', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
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.Hide;
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.Show;
end;

procedure InitializeWizard();
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.TypesCombo.ItemIndex := 0;
WizardForm.WelcomeLabel1.Color := Color;
WizardForm.InfoBeforeClickLabel.Color := Color;
WizardForm.MainPanel.Color := Color;
WizardForm.PageNameLabel.Color := Color;
WizardForm.PageDescriptionLabel.Color := Color;
WizardForm.ReadyLabel.Color := Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.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.NoIconsCheck.Width := ScaleY(16)

URLLabelShadow := TLabel.Create(nil);
with URLLabelShadow do
begin
Parent := WizardForm;
SetBounds(ScaleX(25), ScaleY(331), 0, 0);
AutoSize := True;
Transparent := True;
Font.Color := $969696;
Font.Height := -12;
Font.Style := Font.Style + [fsBold];
Caption := 'http://Сайт/';
end;

URLLabel := TLabel.Create(nil);
with URLLabel do
begin
Parent := WizardForm;
SetBounds(ScaleX(25) - dURL, ScaleY(331) - dURL, 0, 0);
AutoSize := True;
Transparent := True;
Cursor := crHand;
Font.Color := clMaroon;
Font.Height := -12;
Font.Style := Font.Style + [fsBold];
Caption := 'http://Сайт/';
BringToFront;
OnClick := @URLLabelClick;
OnMouseDown := @URLLabelMouseDown;
OnMouseUp := @URLLabelMouseUp;
end;

with TLabel.Create(nil) do
begin
Parent:= WizardForm.SelectProgramGroupPage;
SetBounds(WizardForm.NoIconsCheck.Left + 18, WizardForm.NoIconsCheck.Top + 2, 0, 0)
AutoSize:= True;
Transparent := True;
Font.Color := clWhite;
Caption := SetupMessage(msgNoProgramGroupCheck2);
end;
end;

vint56 16-04-2013 14:37 2133718

GolD18
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
const
dURL = 2;
Color = clblack;

var
URLLabel, URLLabelShadow: TLabel;
ResultCode: Integer;

procedure URLLabelClick(Sender: TObject);
begin
ShellExec('open', 'http://forum.oszone.net/thread-257328-21.html', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
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.Hide;
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.Show;
end;

procedure InitializeWizard();
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.TypesCombo.ItemIndex := 0;
WizardForm.WelcomeLabel1.Color := Color;
WizardForm.InfoBeforeClickLabel.Color := Color;
WizardForm.MainPanel.Color := Color;
WizardForm.PageNameLabel.Color := Color;
WizardForm.PageDescriptionLabel.Color := Color;
WizardForm.ReadyLabel.Color := Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.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.NoIconsCheck.Width := ScaleY(16)

URLLabelShadow := TLabel.Create(nil);
with URLLabelShadow do
begin
Parent := WizardForm.WelcomeLabel1;
SetBounds(ScaleX(25), ScaleY(25), 0, 0);
AutoSize := True;
Transparent := True;
Font.Color := $969696;
Font.Height := -12;
Font.Style := Font.Style + [fsBold];
Caption := 'http://forum.oszone.net';
end;

URLLabel := TLabel.Create(nil);
with URLLabel do
begin
Parent := WizardForm.WelcomeLabel1;
SetBounds(ScaleX(25) - dURL, ScaleY(25) - dURL, 0, 0);
AutoSize := True;
Transparent := True;
Cursor := crHand;
Font.Color := clMaroon;
Font.Height := -12;
Font.Style := Font.Style + [fsBold];
Caption := 'http://forum.oszone.net';
BringToFront;
OnClick := @URLLabelClick;
OnMouseDown := @URLLabelMouseDown;
OnMouseUp := @URLLabelMouseUp;
end;

with TLabel.Create(nil) do
begin
Parent:= WizardForm.SelectProgramGroupPage;
SetBounds(WizardForm.NoIconsCheck.Left + 18, WizardForm.NoIconsCheck.Top + 2, 0, 0)
AutoSize:= True;
Transparent := True;
Font.Color := clWhite;
Caption := SetupMessage(msgNoProgramGroupCheck2);
end;
end;

Gnom_aka_Lexander 16-04-2013 15:23 2133758

GolD18, моя вариация черного инсталла, на базе реализации модуля TransparentStatik от south:
читать дальше »
Код:

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

[*Code]
const
  bColor=clBlack;  // Цвет фона
  fColor=clWhite;  // Цвет текста
  rColor=clBtnFace;// Цвет цвет прозрачности у битмапов

procedure ColorChange(c:TWinControl);
var
  i:integer;
  wc:TWinControl;
begin
  for i:=0 to c.ControlCount-1 do
  begin
    if c.Controls[i] is TGraphicControl then
    begin
      if TGraphicControl(c.Controls[i]) is TBevel then TBevel(c.Controls[i]).Height := 1;
      if TGraphicControl(c.Controls[i]) is TBitmapImage then
      begin
        TBitmapImage(c.Controls[i]).BackColor := clNone;
        TBitmapImage(c.Controls[i]).ReplaceColor := rColor;
        TBitmapImage(c.Controls[i]).ReplaceWithColor := clNone;
      end;
    end;
    if c.Controls[i] is TWinControl then
    begin
      wc:=TWinControl(c.Controls[i]);
      if wc is TNewStaticText then TNewStaticText(c.Controls[i]).Font.Color := fColor;
      if wc is TNewNotebookPage then TNewNotebookPage(c.Controls[i]).Color := bColor;
      if wc is TPanel then TPanel(c.Controls[i]).Color := bColor;
      if wc is TRichEditViewer then
      begin
        TRichEditViewer(c.Controls[i]).Color := bColor;
        TRichEditViewer(c.Controls[i]).Font.Color := fColor;
      end;
      if wc is TMemo then
      begin
        TMemo(c.Controls[i]).Color := bColor;
        TMemo(c.Controls[i]).Font.Color := fColor;
      end;
      if wc is TEdit then
      begin
        TEdit(c.Controls[i]).Color := bColor;
        TEdit(c.Controls[i]).Font.Color := fColor;
      end;
      if wc is TNewEdit then
      begin
        TNewEdit(c.Controls[i]).Color := bColor;
        TNewEdit(c.Controls[i]).Font.Color := fColor;
      end;
      if wc.ControlCount>0 then ColorChange(wc);
    end;
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.Color := bColor;
  ColorChange(WizardForm);
end;

procedure InitializeUninstallProgressForm();
begin
  UninstallProgressForm.Color := bColor;
  ColorChange(UninstallProgressForm);
end;


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

ilya_klimovich 16-04-2013 16:46 2133808

В is done прописал

Цитата:

if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\data1.bin'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
в процессе установке игры, сразу пишет откат изменений и ничего не устанавливается, как исправить?

vint56 16-04-2013 17:04 2133816

ilya_klimovich
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

ilya_klimovich 16-04-2013 17:06 2133817

вопрос о define records. чтобы было все норм, нужно сначала установить игру с выкл define records, чтобы он считал файлы, а потом включить и снова установить. я прав?

vint56 16-04-2013 17:23 2133828

ilya_klimovich почти после установки тебе на раскаментировать records и заново откомпилировать проект чтобы файл records добавился в setup

ilya_klimovich 16-04-2013 18:35 2133883

после того как прописываю
Цитата:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
выбивается ошибка при компиляции
Цитата:

unknown identifier" notPCFonFLY"

Nightwishh 16-04-2013 20:58 2133994

ilya_klimovich, Попробуй так
Код:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), False {PCFonFLY}) then break;

ilya_klimovich 16-04-2013 21:06 2134002

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

saurn 16-04-2013 21:24 2134020

Цитата:

Цитата ilya_klimovich
unknown identifier" notPCFonFLY" »

В скрипте отсутствуют данные константы:
Код:

const
  PCFonFLY = true;
  notPCFonFLY = false;

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

habib2302, ну серьёзно, вы это можете сделать и сами
читать дальше »
Код:

#define Components

#ifdef Components
[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive; ExtraDiskSpaceRequired: 70000000;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive; ExtraDiskSpaceRequired: 70000000;
Name: AIDA643; Description: {#AIDA643}; Flags: exclusive; ExtraDiskSpaceRequired: 70000000;
#endif

[code]
...
    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
   
TmpValue:=1;
    if IsComponentSelected('AIDA641') then Comps1:=Comps1+TmpValue;    //компонент 1
   
TmpValue:=TmpValue*2;
    if IsComponentSelected('AIDA642') then Comps1:=Comps1+TmpValue;    //компонент 2
   
TmpValue:=TmpValue*2;
    if IsComponentSelected('AIDA643') then Comps1:=Comps1+TmpValue;    //компонент 3
#endif

/////////////////////////////////////////////////////////////////////////////////////

 
if not ISArcExtract ( 1, 0, ExpandConstant('{src}\AIDA641.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
  if not ISArcExtract ( 2, 0, ExpandConstant('{src}\AIDA642.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
  if not ISArcExtract ( 3, 0, ExpandConstant('{src}\AIDA643.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
...


ilya_klimovich 16-04-2013 21:33 2134027

isdone
PHP код:

[CustomMessages]
rus.ArcTitle=Распаковка игровых архивов...
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus
.ArcInfo=Архив: %1 из %2
rus
.AllProgress=Прогресс распаковки архивов:
rus.Extracting=Распаковывается: %1
rus
.Taskbar=%1%%, ждите %2
rus
.ArcRemains=Осталось ждать %1
rus
.LongTime=вечно
rus
.Ending=завершение
rus
.ArcFail=Распаковка архивов не завершена!
rus.ArcBreak=Распаковка архивов прервана!
rus.ArcFinishedHeading=Установка игры {#AppName} не завершена
rus.ArcError=Установка игры {#MyAppName} не была завершена.
rus.ArcTrouble=Пожалуйстаустраните проблему и запустите установку снова.
rus.ArcBroken=Возможноархив %1 повреждён или недостаточно места на диске назначения.
rus.ExtractedFile=Распаковывается файл:
rus.CancelButton=Отменить распаковку
rus
.ArcTitleBack=Откат изменений...
rus.ISDoneError=Ошибка распаковки!

[
UninstallDelete]
TypefilesandordirsName: {app}

[
code]
var
  
LabelPctLabelCurrFileNameLabelStatusRollbackLabelStatusTLabel;
  
ISDoneProgressBarTNewProgressBar;
  
CancelUnpackingBtnHWND;
  
OveralPct,Canceln:integer;
  
CallBack:longword;
  
MyError:boolean;
  
pr:Extended;
  
msgErrorstring;
  
ISDonePBTImgPB;

type
  TCallback 
= function (Pctinteger;CurrentFile:string): longword;

  
TMessage record hWndHWNDmsgwParamWordlParamLongWordTimeTFileTimeptTPointend;

function 
PeekMessage(var lpMsgTMessagehWndHWNDwMsgFilterMinwMsgFilterMaxwRemoveMsgUINT): BOOLexternal 'PeekMessageA@user32.dll stdcall';
function 
TranslateMessage(const lpMsgTMessage): BOOLexternal 'TranslateMessage@user32.dll stdcall';
function 
DispatchMessage(const lpMsgTMessage): Longintexternal 'DispatchMessageA@user32.dll stdcall';
function 
WrapMyCallback(callback:TCallbackparamcount:integer):longword;external 'wrapcallback@files:innocallback.dll stdcall';
function 
ISArcExtract(CurComponent:longword; var OveralPct:integerPctOfTotal:doubleInNameOutPathstringDeleteInFile:booleancallbacklongwordPasswordCfgFileWorkPathString):BOOLexternal 'ISArcExtract@files:ISDone.dll stdcall';
function 
IS7ZipExtract(CurComponent:longword; var OveralPct:integerPctOfTotal:doubleInNameOutPathstringDeleteInFile:booleancallbacklongwordPasswordString):BOOLexternal 'IS7zipExtract@files:ISDone.dll stdcall';
function 
ISRarExtract(CurComponent:longword; var OveralPct:integerPctOfTotal:doubleInNameOutPathstringDeleteInFile:booleancallbacklongwordPasswordString):BOOLexternal 'ISRarExtract@files:ISDone.dll stdcall';
function 
ISPrecompExtract(CurComponent:longword; var OveralPct:integerPctOfTotal:doubleInNameOutFilestringDeleteInFile:booleancallbacklongword):BOOLexternal 'ISPrecompExtract@files:ISDone.dll stdcall';
function 
ISSRepExtract(CurComponent:longword; var OveralPct:integerPctOfTotal:doubleInNameOutFileIdxFilestringDeleteInFile:booleancallbacklongword):BOOLexternal 'ISSrepExtract@files:ISDone.dll stdcall';
function 
ShowChangeDiskWindow(TextDefaultPathSearchFile:string):BOOLexternal 'ShowChangeDiskWindow@files:ISDone.dll stdcall';
function 
StartRecord(RecordFileName:stringAllComponents:longword):BOOLexternal 'StartRecord@files:ISDone.dll stdcall';
function 
CheckPoint(CurComponent:Integer):BOOLexternal 'CheckPoint@files:ISDone.dll stdcall';
function 
StopRecord:BOOLexternal 'StopRecord@files:ISDone.dll stdcall';
function 
GetWindowLong(hWndnIndexInteger): Longintexternal 'GetWindowLongA@user32 stdcall delayload';
function 
SetWindowText(hWndLongintlpStringAnsiString): Longintexternal 'SetWindowTextA@user32 stdcall delayload';
function 
cm(MessageString): StringBegin Result:= ExpandConstant('{cm:'Message +'}'End;

Procedure SetTaskBarTitle(TitleAnsiString); var hInteger;
begin
  h
:= GetWindowLong(MainForm.Handle, -8); if <> 0 then SetWindowText(hTitle);
end;

procedure AppProcessMessage;
var
    
MsgTMessage;
begin
    
while PeekMessage(Msg0001) do begin
        TranslateMessage
(Msg);
        
DispatchMessage(Msg);
    
end;
end;

function 
ProgressCallback(PctintegerCurrentFile:string): longword;
begin
   ImgPBSetPosition
(ISDonePB,Pct/10);
   
LabelPct.Caption :=ExpandConstant('{cm:AllProgress} ')+IntToStr(Pct div 10)+'.'+IntToStr(Pct mod 10)+'%';
   
LabelCurrFileName.Caption :=ExpandConstant('{app}\')+CurrentFile;
   AppProcessMessage;
   Result := Cancel;
   ImgApplyChanges(WizardForm.Handle);
end;

procedure Error;
var    n:integer;
begin
    Cancel:= -1;
    Exec(ExpandConstant('
{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);
end;

procedure CreateISDoneComponents;
begin
    LabelPct := TLabel.Create(WizardForm);
  with LabelPct do begin
    AutoSize:=False;
    SetBounds(ScaleX(-70), ScaleY(170), ScaleX(638), ScaleY(17));
    Alignment := taCenter;
    Transparent:=True;
    Font.Name:= '
Georgia'
    Font.Size:= 8;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsItalic];
    Parent := WizardForm;
  end;
    LabelCurrFileName := TLabel.Create(WizardForm);
  with LabelCurrFileName do begin
    AutoSize:=False;
    SetBounds(ScaleX(41), ScaleY(105), ScaleX(638), ScaleY(17));
    Transparent:=True;
    Font.Name:= '
Georgia'
    Font.Size:= 8;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsItalic];
    Caption:= '';
    Parent := WizardForm;
    Hide;
  end;
    LabelStatusRollback := TLabel.Create(WizardForm);
  with LabelStatusRollback do begin
    Parent    := WizardForm;
    AutoSize  := False;
    SetBounds(ScaleX(41), ScaleY(80), ScaleX(400), ScaleY(17));
    Transparent:=True;
    Font.Name:= '
Georgia';
    Font.Size:= 8;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption   := cm('
ArcTitleBack');
  end;
    LabelStatus := TLabel.Create(WizardForm);
  with LabelStatus do begin
    Parent    := WizardForm;
    AutoSize  := False;
    SetBounds(ScaleX(41), ScaleY(80), ScaleX(400), ScaleY(17));
    Transparent:=True;
    Font.Name:= '
Georgia';
    Font.Size:= 8;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption   := cm('
ArcTitle');
  end;
end;

procedure CancelUnpackingOnEnter(hBtn:HWND);
begin
  sndPlaySound(ExpandConstant('
{tmp}WFEnter.wav'),$0001);
     end;

procedure CancelUnpackingOnClick(hBtn:HWND);
begin
  sndPlaySound(ExpandConstant('
{tmp}Click.wav'),$0001);
  if MsgBox( SetupMessage( msgExitSetupMessage ), mbConfirmation, MB_YESNO ) = IDYES then Cancel:= 1;
  end;

Procedure UnpackingISDoneFinished(CurPageID: Integer);
begin
  if (CurPageID = wpFinished) and (Cancel <> 0) then
  begin
      WizardForm.Caption:= ExpandConstant('
{cm:ISDoneError}');
      SetTaskBarTitle(SetupMessage(msgErrorTitle));
      FinishedHeadingLabel.Caption:=cm('
ArcFinishedHeading');
      FinishedHeadingLabel.Font.Color:= $0000C0;    // red (красный)
      FinishedLabel.Caption:= msgError + ExpandConstant(' 
{cm:ArcTrouble}') + #10#13#10#13+ExpandConstant('{cm:FinishedLabel2}');
      FinishedLabel.Font.Color:= $0000C0;    // red (красный)
end;
  CancelUnpackingBtn:=BtnCreate(WizardForm.Handle,408,297,80,80,ExpandConstant('
{tmp}button.png'),10,False);
  BtnSetEvent(CancelUnpackingBtn,BtnMouseEnterEventID,WrapBtnCallback(@CancelUnpackingOnEnter,1));
  BtnSetEvent(CancelUnpackingBtn,BtnClickEventID,WrapBtnCallback(@CancelUnpackingOnClick,1));
  BtnSetFont(CancelUnpackingBtn,WFButtonFont.Handle);
  BtnSetFontColor(CancelUnpackingBtn,$ffffff,$000000,$ffffff,$B6B6B6);
  BtnSetCursor(CancelUnpackingBtn,GetSysCursorHandle(32649));
  BtnSetVisibility(CancelUnpackingBtn, False);
end;

procedure UnpackingISDone(CurStep: TSetupStep);
begin
   if CurStep = ssPostInstall then
     if MyError then Error;
  if CurStep = ssInstall then begin
    ISDonePB:=ImgPBCreate(WizardForm.Handle, ExpandConstant('
{tmp}ProgressBackground.png'), ExpandConstant('{tmp}ProgressImg.png'),ScaleX(41),ScaleY(130),ScaleX(330),WizardForm.ProgressGauge.Height);
    NewPB:=ImgPBCreate(WizardForm.Handle, ExpandConstant('
{tmp}ProgressBackground2.png'), ExpandConstant('{tmp}ProgressImg.png'),376,130,80,WizardForm.ProgressGauge.Height);
    ImgApplyChanges(WizardForm.Handle);
    PBOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,CallBackProc(@PBProc,4));
    LabelStatus.Show;
    BtnSetText(CancelUnpackingBtn,WizardForm.CancelButton.Caption);
    BtnSetVisibility(CancelUnpackingBtn, True);
    BtnSetVisibility(hCancelBtn, False);
    LabelPct.Show;
    LabelCurrFileName.Show;
    ProgressInfoLabel.Hide;
    CallBack:=WrapMyCallback(@ProgressCallback,2);
    Cancel:=0;
    OveralPct:=0;

    // Распаковка всех необходимых файлов в папку {tmp}. Это необходимо для того, чтобы
//выполнять установку в момент ssInstall, и секция [Run] выполнялась после установки.
#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

    StartRecord(ExpandConstant('
{src}records.inf'),0);
    repeat
MyError:=true;
       
if not ISArcExtract ( 0, 0, ExpandConstant('
{src}data1.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), False {PCFonFLY}) then break;
       //if not ISArcExtract    ( 0, OveralPct, 0, ExpandConstant('
{src}data1.bin'),  ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
       //if not ISArcExtract    ( 0, OveralPct, 0, ExpandConstant('
{src}data2.bin'),  ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
       //if not ISArcExtract    ( 0, OveralPct, 0, ExpandConstant('
{src}data3.bin'),  ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
       //if not ISArcExtract    ( 0, OveralPct, 0, ExpandConstant('
{src}data4.bin'),  ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
       //if not ISArcExtract    ( 0, OveralPct, 0, ExpandConstant('
{src}data5.bin'),  ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
       //if not ISSRepExtract   ( 0, OveralPct, 0, ExpandConstant('
{app}White Gold.srp'), ExpandConstant('{app}White Gold.7z'), '', true, CallBack                 ) then break;
       //if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('
{app}NFS.pcf'),  ExpandConstant('{app}NFS.7z'),      true, CallBack                  ) then break;
       //if not IS7ZipExtract   ( 0, OveralPct, 0, ExpandConstant('
{app}White Gold.7z'),   ExpandConstant('{app}'),                true, CallBack, ''               ) then break;
        //  if not ShowChangeDiskWindow('
Пожалуйставставьте диск 2 и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW2_Disk2.arc'                   ) then break;
        //  if not ISArcExtract    ( 1, OveralPct, 0, ExpandConstant('
{src}rustext.arc'), ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
        //  if not ISArcExtract    ( 2, OveralPct, 0, ExpandConstant('
{src}engtext.arc'), ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
        //  if not ISArcExtract    ( 3, OveralPct, 0, ExpandConstant('
{src}rusvoice.arc'),ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
        //  if not ISArcExtract    ( 4, OveralPct, 0, ExpandConstant('
{src}engvoice.arc'),ExpandConstant('{app}'),                false,CallBack, '',    '',    '') then break;
MyError:=false;
    until true;
    StopRecord;
    BtnSetVisibility(CancelUnpackingBtn, False);
    BtnSetVisibility(hCancelBtn, True);
    BtnSetEnabled(hCancelBtn, False);
    LabelStatus.Hide;
    LabelPct.Hide;
    LabelCurrFileName.Hide;
    ProgressInfoLabel.Show;
  end;
end; 

inno
Цитата:

[code]
const
PCFonFLY = true;
notPCFonFLY = false;
BASS_ACTIVE_PAUSED = 3;
BASS_SAMPLE_LOOP = 4;
WFDiskTimerID = 1;
WFSysReqTimerID = 2;
ARTitleTimerID = 2;
в const прописываю и все равно ошибка

vint56 16-04-2013 22:07 2134050

ilya_klimovich а версия isdone какая 5 или 6

ilya_klimovich 16-04-2013 22:11 2134054

а что такое?? просто я не знаю какая версия

vint56 16-04-2013 22:48 2134078

ilya_klimovich у тебя версия ISDone0.4.2.5
if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\Data-A.bin'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;

ilya_klimovich 16-04-2013 23:32 2134106

vint56
но когда я прописываю так
Цитата:

if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\Data-A.bin'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
то у меня сразу в процессе установки пишет откат изменений, и ничего не устанавливается

vint56 17-04-2013 00:00 2134120

ilya_klimovich либо метод сжатия не известен либо возле setup есть еще один файл с расшерением .bin но родной от inno setup вот по этому что не может распаковать архив идёт откат изменений

ilya_klimovich 17-04-2013 00:23 2134133

блин ничего не помогает, помогите кто)

habib2302 17-04-2013 01:22 2134158

saurn, выдает ошибку

saurn 17-04-2013 01:59 2134163

habib2302,ну, вот жешь двоечник :)

Это кусок секции из скрипта ISDone:
Код:

    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
    TmpValue:=1;
    if IsComponentSelected('AIDA641') then Comps1:=Comps1+TmpValue;    //компонент 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('AIDA642') then Comps1:=Comps1+TmpValue;    //компонент 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('AIDA643') then Comps1:=Comps1+TmpValue;    //компонент 3
#endif

/////////////////////////////////////////////////////////////////////////////////////

  //компонент 1//  if not ISArcExtract ( 1, 0, ExpandConstant('{src}\AIDA641.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
  //компонент 2//  if not ISArcExtract ( 2, 0, ExpandConstant('{src}\AIDA642.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
  //компонент 3//  if not ISArcExtract ( 3, 0, ExpandConstant('{src}\AIDA643.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

Соответственно, возьмите пример ISDone, найдите в нем аналогичные строки и измените их. Выделенное красным: имена компонентов, которые вы задаете в секции Components, выделенное жирным: номера архивов соответствующие компонентам, к которым оные привязаны.
...

ilya_klimovich 17-04-2013 15:56 2134500

короче если пропиcываю в isdone файлы с расширением arc то устанавливается все нормально, то когда эти архивы сохраняю в ultraiso как bin и прописываю их в isdone то при компиляции выбивается ошибка

saurn 17-04-2013 16:20 2134516

ilya_klimovich, ну вы даёте) Конечно будет ошибка, ведь UltraISO создаёт из вашего архива образ диска. Хотите подцепить архивы с расширением *bin? Просто сотрите расширение *arc и напишите bin при создании архива. Таким образом и получите эдакий псевдо-бинарник на самом деле являющийся архивом *arc. Тогда и с установкой проблем не будет.

Nightwishh 17-04-2013 16:20 2134517

ilya_klimovich, В Ультраисо? Файлы .bin создаются в архиваторе FreeArc, с переименованием .arc на .bin в строке выхода архива.

ilya_klimovich 17-04-2013 22:05 2134737

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

ilya_klimovich 17-04-2013 23:32 2134779

Хотя все, разобрался. Как при создании репака удалить ненужные локализации?

habib2302 18-04-2013 13:11 2135038

дайте мне по человечески полный скрипт (т.е с полным списком фалов который нужны и т.п) на распаковку .arc архивов, учитывая выбранные компоненты!!!!!!!:angry2::splat:

Shegorat 18-04-2013 14:15 2135071

Цитата:

Цитата habib2302
дайте мне по человечески полный скрипт (т.е с полным списком фалов который нужны и т.п) на распаковку .arc архивов, учитывая выбранные компоненты!!!!!!! »

Скачай ISDone, там все есть. Посмотри справку к нему - узнаешь как сделать распаковку с компонентами.

2ALL:
Все вам дайте, как будто вам здесь что-то должны. Все должны сделать за вас, а вы будете использовать все готовенькое. С такими запросами далеко не уедешь. Учитесь уважать участников форума и их работу. Учитесь, в конце то концов, думать сами.

habib2302 18-04-2013 15:58 2135149

вот мой скрипт.вставить пожалуйста как все положенно в том числе и список файло и т.п
читать дальше »
; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Extreme Engineer"
#define AIDA643 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AIDA64EXE3 "aida64.exe"
#define AuthRep "Xabib"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.p ng
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoVersion={#MyAppVersion}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
DirExistsWarning=no
AppendDefaultDirName=no
AppendDefaultGroupName=no
LicenseFile=license.txt
DisableReadyPage=yes
AppId=TheBestAidaInstallEver

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;
Name: AIDA643; Description: {#AIDA643}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: license.txt; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: 1.ico; DestDir: {app}; Flags: ignoreversion
Source: 2.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AIDA641}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
Source: {app}\{#AIDA643}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA643;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{#AIDA643}; Filename: {app}\{#AIDA64EXE3}; Components: AIDA643;
Name: {group}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642; IconFilename: {app}\1.ico;
Name: {group}\{cm:UninstallProgram,{#AIDA643}}; Filename: {uninstallexe}; Components: AIDA643; IconFilename: {app}\2.ico;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA643;
Name: {group}\Справка {#AIDA641}; Filename: {app}\aida64.chm; Components: AIDA641;
Name: {group}\Справка {#AIDA642}; Filename: {app}\aida64.chm; Components: AIDA642;
Name: {group}\Справка {#AIDA643}; Filename: {app}\aida64.chm; Components: AIDA643;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {commondesktop}\{#AIDA643}; Filename: {app}\{#AIDA64EXE3}; Tasks: icons\desktop; Components: AIDA643;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA643}; Filename: {app}{#AIDA64EXE3}; Tasks: icons\quicklaunchicon; Components: AIDA643;

[Run]
Filename: {app}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {app}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;
Filename: {app}\{#AIDA64EXE3}; Description: "{cm:LaunchProgram,{#StringChange(AIDA643, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA643;

[Messages]
BeveledLabel=RePack by {#AuthRep}

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

const
RT_RCDATA = 10;
APPID_AIDA_EXTREME = 'AIDA64 Extreme Edition';
APPID_AIDA_ENGINEER = 'AIDA64 Extreme Engineer';
APPID_AIDA_BUISNES = 'AIDA64 Business Edition';

WAIT_OBJECT_0 = $0;
STARTF_USESHOWWINDOW = 1;
NORMAL_PRIORITY_CLASS = $00000020;
INFINITE = $FFFFFFFF;

type
_STARTUPINFO = record
cb: DWORD;
#ifdef UNICODE
lpReserved, lpDesktop, lpTitle: PAnsiChar;
#else
lpReserved, lpDesktop, lpTitle: PChar;
#endif
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
wShowWindow, cbReserved2: Word;
lpReserved2: Byte;
hStdInput, hStdOutput, hStdError: THandle;
end;

_PROCESS_INFORMATION = record
hProcess: THandle;
hThread: THandle;
dwProcessId: DWORD;
dwThreadId: DWORD;
end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif

var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;
ResultCode: Integer;
lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
BtnImage: TBitmapImage;
CheckLicense: TCheckBox;
iInitialize: Boolean;


function GetUninstallPath(const AppIds: array of String): array of String;
var
StringList: TStringList;
i, Len: Integer;
Buff: String;
begin
for i := 0 to GetArrayLength(AppIds)-1 do
begin
Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
if Buff <> '' then
begin
Len := GetArrayLength(Result);
SetArrayLength(Result, Len+1);
Result[Len] := Buff;
end;
end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
pi: _PROCESS_INFORMATION;
si: _STARTUPINFO;
i: Integer;
begin
for i := 0 to GetArrayLength(UninstallPathes)-1 do
begin
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_SHOWNORMAL;
#ifdef UNICODE
if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
#else
if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
#endif
begin
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
Exit;
end;
try
while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
finally
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
end;
end;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
finally
lResStream.Free;
Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
end;
end;

function InitializeSetup:boolean;
var
i, Len: Integer;
uArray: array of String;
begin
uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES, APPID_AIDA_ENGINEER] );
Len := GetArrayLength(uArray);
Result := Len = 0;
if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
begin
UninstallApps(uArray);
Result := InitializeSetup();
end;
end;

procedure LicenseOnClick(Sender: TObject);
begin
case TCheckBox(Sender).Checked of
True: WizardForm.LicenseAcceptedRadio.Checked := True;
False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+''
else
if IsComponentSelected('AIDA642') then
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
if IsComponentSelected('AIDA643') then
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
end;

procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+''
else
if IsComponentSelected('AIDA642') then
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
if IsComponentSelected('AIDA643') then
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
end;

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
with WizardForm.ComponentsList do
begin
Top := ScaleY(50);
Height := ScaleY(155);
end;
end;

procedure InitializeWizard;
begin
RedesignWizardForm;
WizardForm.TypesCombo.hide;
PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
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;
with WizardForm do
begin
iInitialize := True;
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
begin
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgApplyChanges(WizardForm.Handle);
end;

ExtractTemporaryFile('WinTB.dll');
SetTaskBarProgressValue(0, 60);
SetTaskBarProgressState(0, TBPF_ERROR);
TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

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(nil);
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;

with TLabel.Create(WizardForm) do
begin
Parent:=WizardForm;
AutoSize:=False;
Transparent:= true;
SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
end;
end;
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]
if IsComponentSelected('AIDA641') then
begin
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
end else
if IsComponentSelected('AIDA642') then
begin
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
end else
if IsComponentSelected('AIDA643') then
begin
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA643}'
WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA643}'
end;
end;
wpSelectTasks:
begin
WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
end;
end;
end;

procedure DeinitializeSetup();
begin
if iInitialize then
begin
gdipShutdown;
TaskBarDestroy;
end;
end;

procedure InitializeUninstallProgressForm;
begin
with UninstallProgressForm do
begin
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgApplyChanges(UninstallProgressForm.Handle);
end;

with TLabel.Create(nil) do
begin
Parent:=UninstallProgressForm;
AutoSize:=False;
Transparent:= true;
SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
end;
end;
end;

procedure DeinitializeUninstall();
begin
gdipShutdown;
end;

p.s а той справкой только жоп* подтерать

GolD18 18-04-2013 17:45 2135230

Подскажите, где исправить,чтобы Дополнительно ПО устанавливалось добровольно? Не захотел - убрал галочку. И какой флаг поставить, чтобы галочку всегда стояла на SangFroidSetup и убрать ее было нельзя?


читать дальше »
[Tasks]
Name: Soft; Description: Установка софта:; Flags: unchecked
Name: Soft\VCCheck; Description: Установить Microsoft Visual C++ 2010 Redist
Name: Soft\DirectX; Description: Установить DirectX
Name: Soft\SFS; Description: Установить SangFroidSetup

[Run]
Filename: {src}\Redist\vcredist_x86.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ 2010 Redist...; Flags: skipifdoesntexist; Check: CheckError
Filename: {src}\Redist\dxwebsetup.exe; Parameters: /q; StatusMsg: Обновление DirectX...; Flags: skipifdoesntexist; Check: CheckError
Filename: {src}\Redist\SangFroidSetup.exe; Parameters: /q; StatusMsg: Установка SangFroidSetup ...; Flags: skipifdoesntexist; 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
Source: instalfiles\*; DestDir: {tmp};

saurn 18-04-2013 17:58 2135248

GolD18
Код:

[Tasks]
Name: Soft\SFS; Description: Установить SangFroidSetup

[Run]
Filename: {src}\Redist\SangFroidSetup.exe; Parameters: /q; StatusMsg: Установка SangFroidSetup ...; Flags: skipifdoesntexist; Tasks: Soft\SFS; Check: CheckError

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

ilya_klimovich 18-04-2013 18:29 2135281

посдскажите пожалуйста как при создании репака удалить все локализации кроме русской и английской?

insombia 18-04-2013 19:46 2135321

ilya_klimovich дааа,вспоминается картинка с 2 гопниками...

neorom 18-04-2013 21:14 2135405

Можно ли скрить надпись C:\Program Files\ со страници розпаковки файлов и стало бы
P.S. Сукция код отсуствуєт.

saurn 18-04-2013 21:27 2135411

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

Немного измененный перепост:
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirname={pf}\My Program
Compression=none


[Files]
Source: C:\Windows\fonts\*; DestDir: {app}; BeforeInstall: BetterInfo();


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

var
 
hInfoFile: HWND;

function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

procedure BetterInfo();
var
 
CurrentFile: String;
begin
 
CurrentFile := ExpandConstant(CurrentFilename);
  SetWindowText(hInfoFile,  ExtractFileName(CurrentFile));
end;

procedure InitializeWizard();
begin
  with
WizardForm do
  begin
    with
TNewStaticText.Create(nil) do
    begin
     
Parent := FilenameLabel.Parent;
      SetBounds(FilenameLabel.Left, ScaleY(20), ProgressGauge.Width, ScaleY(16));
      hInfoFile := Handle;
      AutoSize := False;
    end;
    FilenameLabel.Hide;
  end;
end;

Оригинальный пост: http://forum.oszone.net/post-2091992-1651.html Поиском когда пользоватся будем?

Можно еще как-то так:
Код:


[Files]
Source: C:\Windows\fonts\*; DestDir: {app}; BeforeInstall:BetterInfo();

[code]
var
fLabel: TNewStaticText;

procedure BetterInfo();
begin
 
fLabel.Caption := MinimizePathName(ExtractFileName(ExpandConstant(CurrentFilename)), WizardForm.FilenameLabel.Font, WizardForm.FilenameLabel.Width);
end;

procedure InitializeWizard();
begin
  with
WizardForm do
  begin
   
fLabel := TNewStaticText.Create(nil)
    with fLabel do
    begin
     
Parent := FilenameLabel.Parent;
      SetBounds(FilenameLabel.Left, ScaleY(20), ProgressGauge.Width, ScaleY(16));
    end;
    FilenameLabel.Hide;
  end;
end;


insombia 18-04-2013 23:12 2135482

neorom пиши грамотно,о то глаза болят

neorom 18-04-2013 23:39 2135493

Как добавить перед имям файла, имя папки при розпаковки.
Пример C:\Program Files\Restorator 2009\Help\FAQ.html а желательно чтоби било Help\FAQ.html , в окне инсталяции только єсть имя файла FAQ.html, а желательно чтоби било перед имям файла, имя папки, как у примере.

elmariacci 19-04-2013 13:13 2135735

Вопрос такого характера- есть несколько компонентов,при выборе которых инсталятор должен сделать проверку на наличие подпапки в директории с игрой,на которую ставиться патч.
Сам патч ставиться по адрессу {app} там должна находиться папка audio ,если ее нет,то запретить продолжение работы.Мне уже дырку в голове сделали,потому как нечитатели ставят патч и пропадают звуки в игре...так как нужно сперва скопировать папку audio в папку с патчем,куда и ставяться все моды...

Johny777 19-04-2013 16:00 2135906

neorom, на основе последнего примера saurn:
читать дальше »
Код:

[Files]
Source: C:\Windows\fonts\*.ttf; DestDir: {app}\fonts; BeforeInstall: BetterInfo();

[code ]
var
   
fLabel: TNewStaticText;
    AppPath: String;

procedure BetterInfo();
var
   
Buff: String;
begin
   
Buff := ExpandConstant(CurrentFilename);
    StringChange(Buff, AppPath, '');
    fLabel.Caption := Buff;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall:
        begin
           
AppPath := WizardDirValue(); // WizardForm.DirEdit.Text;
           
fLabel := TNewStaticText.Create(WizardForm)
            with fLabel do
            begin
               
Parent := WizardForm.FilenameLabel.Parent;
                SetBounds(WizardForm.FilenameLabel.Left, ScaleY(20), WizardForm.ProgressGauge.Width, ScaleY(16));
            end;
            WizardForm.FilenameLabel.Hide;
        end;
        ssPostInstall: fLabel.Hide;
    end;
end;


=====================================================
elmariacci,
так сойдёт?
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirname={pf}\My Program
Compression=none

[Components]
Name: "Audio"; Description: "I need audio folder";
Name: "NoAudio"; Description: "I dont care...";


[code ]
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if
CurPageID = wpSelectComponents then
    begin
        if
IsComponentSelected('Audio') then Result := DirExists(AddBackslash(RemoveBackslash(WizardDirValue())) + 'audio') else Result := True;
        if not Result then MsgBox('В выбранной Вами директории установки нет папки "audio"!', mbError, MB_OK);
    end else Result := True;
end;


elmariacci 19-04-2013 16:06 2135915

ну что-то типа того)) попробую прикрутить .Спасибо за понимание)) да только вот проверка идет только на папку следующую запапкой по умолчанию,а как задать дополнительный путь? типа (умолчание)\....\....\audio

Nightwishh 19-04-2013 16:58 2135957

Я опять с вопросом о ComponentsDiskSpaceLabel. Как можно загрузить текст на лейбл, из "ComponentsDiskSpaceLabel"
Код:

Caption:= SetupMessage(msgComponentsDiskSpaceMBLabel);
и
Код:

Caption:= ComponentsDiskSpaceLabel.Caption
что-то не работают!

Mailchik 19-04-2013 17:22 2135964

Nightwishh,
Код:

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

[Code]
procedure InitializeWizard;
 begin
  WizardForm.WelcomeLabel1.Caption := WizardForm.ComponentsDiskSpaceLabel.Caption;
end;


elmariacci 19-04-2013 17:58 2135982

есть вот такая часть скрипта для worldoftanks ))

папка по умолчанию: C:\Games\World_of_tanks

а папка где проверять наличие выглядит так: C:\Games\World_of_tanks\res_mods\0.8.5\audio -именно там она должна быть,иначе при установке любого из двух компонентов пропадает звук,т.к. клиент обращается к папке,где попадают только 2 файла из инсталятора.
Тоесть для проверки могу сделать компонент "zvuk",а вот как прописать путь поиска?
Или второй вариант втихую скопировать нужную папку из одной папки в другую без вмешательство пользователя?

Name: "zvuk"; Description: "Звуки(перед установкой скопируйте папку audio в res_mods\0.8.5\)"
Name: "zvuk\audio"; Description: "Звонок крита";
Name: "zvuk\zasvet"; Description: "Озвучка лампочки";

и потом в секции
[code]

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpSelectComponents then
begin
if IsComponentSelected('zvuk') then Result := DirExists(AddBackslash(RemoveBackslash(WizardDirValue())) + 'audio') else Result := True;
if not Result then MsgBox('В выбранной Вами директории установки нет папки "audio"!', mbError, MB_OK);
end else Result := True;
end;

Johny777 19-04-2013 18:03 2135983

Цитата:

Цитата elmariacci
\....\....\audio »

Хочешь вернуться на два уровня назад? Юзай FileSystemObject (он умеет многое :) ) :
читать дальше »
Код:

[code]
function GetParentFolderName(const Path: String): String;
var
   
oFS: Variant;
begin
   
oFS := CreateOleObject('Scripting.FileSystemObject');
    try
       
Result := oFS.GetParentFolderName(path);
    except
       
ShowExceptionMessage();
    end;
end;

procedure InitializeWizard();
begin
   
MsgBox(GetParentFolderName(GetParentFolderName('C:\Program Files\Adobe\Adobe After Effects CS5')), mbInformation, MB_OK);
end;


несколько примеров его использования есть в шапке темы, остальное в MSDN:
http://msdn.microsoft.com/en-us/libr...=vs.60%29.aspx
http://msdn.microsoft.com/en-us/libr...=vs.60%29.aspx

saurn 19-04-2013 18:09 2135988

elmariacci, если я вас правильно понял, то так:

Код:

if IsComponentSelected('zvuk') then Result := DirExists(AddBackslash(RemoveBackslash(WizardDirValue())) + 'res_mods\0.8.5\audio') else Result := True;

Johny777 19-04-2013 18:18 2135993

Цитата:

Цитата saurn
0.8.5 »

elmariacci эта папка всегда так называется? (В worldoftanks не гамал)

saurn 19-04-2013 18:24 2136001

Цитата:

Цитата Johny777
Всё верно, но эта папка всегда так называется? »

Мм, а вот об этом я что-то не подумал.

Есть вопрос, просветите неуча. Раньше версию системы через код никогда не проверял. Но тут понадобилось, чтобы некая функция вызывалась, только от версии винды 6 и выше( Тоесть Vista, 7 и т.д.)
Код:

function iWinVersion(): Boolean;
begin
  GetWindowsVersionEx (Version);
  if (Version.NTPlatform and (Version.Major > 5)) then
  Result := true
  else Result := False;
end;

Оно?

Johny777 19-04-2013 18:33 2136010

saurn,
Держи: http://forum.oszone.net/post-2108378-1847.html
Определяемые виндовсы: Windows2000, Windows2003, WindowsXP, WindowsVista, Windows7, Windows8


UPD: если нужны только с 6. то кастрируй функцию :) :
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
 
_OSVERSIONINFO = record
   
dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of Char;
  end;

function GetVersionEx(var lpVersionInformation: _OSVERSIONINFO): BOOL; external 'GetVersionEx{#A}@kernel32.dll stdcall';

function IsWin7AndNewer(): Boolean;
var
 
VersionInformation: _OSVERSIONINFO;
begin
 
VersionInformation.dwOSVersionInfoSize := SizeOf(VersionInformation);
  if not GetVersionEx(VersionInformation) then Exit;
  Result := VersionInformation.DwMajorVersion >= 6;
end;


PS: виста и выше это 6.что-то_там

saurn 19-04-2013 18:44 2136023

Цитата:

Цитата Johny777
если нужны только с семёрки то кастрируй функцию »

Да, нужно только от висты и выше. Спасибо за примеры, дальше уже разберусь :)

Цитата:

Цитата Johny777
эта папка всегда так называется? »

Тоже никогда не играл, но думаю эти циферки зависят от версии клиента. Если имя папки аналогично фактической версии, можно выдернуть номер версии из реестра и подставлять строкой в качестве имени папки, что-то типа:
Код:

AddBackslash('res_mods') + ClientVersion + '\audio'
Хотя, это наверное уже изврат)

elmariacci 19-04-2013 18:53 2136029

Цитата:

Цитата Johny777
Цитата saurn:
0.8.5 »
elmariacci эта папка всегда так называется? (В worldoftanks не гамал) »

нет - это локальный патч на данный момент - дальше могут быть другие цифры типа 0.8.6 и тд

ilya_klimovich 19-04-2013 20:02 2136068

мне кто нить отпишет как вырезать ненужные локализации???

neorom 19-04-2013 20:40 2136094

Цитата Johny777:
на основе последнего примера »
Не хочу надокучать, но даний код скрипта не роботаэт правельно. Фото а хотелось би
Скрипт
читать дальше »
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirname={pf}\My Program
Compression=none


[Files]
Source: {app}\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyname; BeforeInstall: BetterInfo()

[code]
var
fLabel: TNewStaticText;
AppPath: String;

procedure BetterInfo();
var
Buff: String;
begin
Buff := ExpandConstant(CurrentFilename);
StringChange(Buff, AppPath, '');
fLabel.Caption := Buff;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall:
begin
AppPath := WizardDirValue(); // WizardForm.DirEdit.Text;
fLabel := TNewStaticText.Create(WizardForm)
with fLabel do
begin
Parent := WizardForm.FilenameLabel.Parent;
SetBounds(WizardForm.FilenameLabel.Left, ScaleY(20), WizardForm.ProgressGauge.Width, ScaleY(16));
end;
WizardForm.FilenameLabel.Hide;
end;
ssPostInstall: fLabel.Hide;
end;
end;

nik1967 19-04-2013 20:53 2136097

Цитата:

Цитата ilya_klimovich
мне кто нить отпишет как вырезать ненужные локализации??? »

А каким боком это относится к теме форума Скрипты Inno Setup. Помощь и советы?

ilya_klimovich 19-04-2013 20:59 2136098

а что тяжело помочь?

insombia 19-04-2013 22:33 2136129

ilya_klimovich какая игра?

audiofeel 19-04-2013 22:37 2136130

ilya_klimovich,
Цитата:

Цитата ilya_klimovich
мне кто нить отпишет как вырезать ненужные локализации??? »

А для чего тебе это нужно? если размер то лично мне на него плевать, а если поделка получается больше 8 гигов я вообще ее не сжимаю, относись с уважением к пользователю твоего "продукта", он ждет по два часа когда распакуется "MAX PAYNE". мне кажется НА ПЕРВОМ МЕСТЕ ПОЛЬЗОВАТЕЛЬ,а уж потом ваши "амбиции, да и многие офф патчи не поставишь без определенных файлов и тд, не гонись ты за этим. так дело пойдет у вас (понравится) вы начнете вырезать не интересные уровни из игр

ilya_klimovich 19-04-2013 22:51 2136133

insombia
NFS Most Wanted

audiofeel

может вы и правы, но все таки?) извиняюсь за настойчивость)

insombia 19-04-2013 22:58 2136135

ilya_klimovich там папки ru en и т д
p.s. прекращаем оффтоп

Nightwishh 20-04-2013 04:46 2136194

Ребят, посмотрите правильно ли я накотал
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then
  begin
    WizardForm.OuterNotebook.Hide;
    WizardForm.ProgressGauge.Show;
    SplashImage.Show;
  end else
  begin
    WizardForm.ProgressGauge.Hide;
    SplashImage.Hide;
    Wizardform.OuterNotebook.Show;
  end;
end;

Смысл это процедуры таков. При переходе на страницу установки, скрывалась "OuterNotebook", слайд шоу (SplashImage) и прогресс бар показывались, а после установки это исчезало (сплеш и прогрессбар) и дальше всё как обычно (переход на финиш паге)! Спасибо!

saurn 20-04-2013 05:46 2136197

Nightwishh, про Parent прогресс-бара забыли, а то он сныкается вместе с внешним Notebook.

Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  case
CurPageID of
   
wpInstalling:
    begin
     
WizardForm.ProgressGauge.Parent := WizardForm;
      WizardForm.OuterNotebook.Hide;
      WizardForm.Bevel.Hide;
      SplashImage.Show;
    end;
    wpFinished:
    begin
     
WizardForm.ProgressGauge.Hide;
      SplashImage.Hide;
      SplashImage.Free;
      WizardForm.OuterNotebook.Show;
      WizardForm.Bevel.Show;
    end;
  end;
end;


Johny777 20-04-2013 14:12 2136352

elmariacci, Ну всё, запилил тебе уберпатчер,для разных папок:
краткое описание работы (а то много буков печатать):
AskForPath( OnlyWithFolder('audio', OnlyVersionFolders( SearchForFolders( AddBackslash(RemoveBackslash( WizardDirValue() )) + 'res_mods') ) ) );
сначала SearchForFolders ищет папки в пути установки + 'res_mods' и возвращает массив путей
он сразу же передаётся в OnlyVersionFolders которая фильтрует пути по последним папкам чтоб они были вериями-номерными и возвращает возможно другой или тот же массив
полученный массив передаётся в OnlyWithFolder, которая ищет на уровне дальше папку "audio" и возвращает новый массив записей
и только теперь полученный массив мы выводим в виде комбобокса на форме и спрашиваем куда именно ставить аудио! :)

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


[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
InfoBeforeFile=compiler:Default.isl


[Components]
Name: "zvuk"; Description: "Звуки(перед установкой скопируйте папку audio в res_mods\XX.XX.XX\)"
Name: "zvuk\audio"; Description: "Звонок крита";
Name: "zvuk\zasvet"; Description: "Озвучка лампочки";


[Files]
; zvuk Files
Source: {fonts}\*; DestDir: {code:GetInstallPath}\audio; Flags: external; Components: zvuk; Check: CheckInstallPath();


[Dirs]
; for Test
Name: "{app}\res_mods\0.8.5\audio"
Name: "{app}\res_mods\0.8.6\audio"

; DUMMY:
Name: "{app}\res_mods\0.8.7"
Name: "{app}\res_mods\hl2"
Name: "{app}\res_mods\Valve"

                                     
[  code]
var
   
InstallPath: String;
   

function GetInstallPath(const Dummy: String): String;
begin
    if
ForceDirectories(InstallPath) then Result := RemoveBackslash(InstallPath);
end;

function CheckInstallPath(): Boolean;
begin
   
Result := InstallPath <> '';
end;

///////////////////////////

function SearchForFolders(const RootFolder: String): array of String// получить имена всех папок в папке (без рекурсии)
var
   
NewSearchPath: String;
    FindRec: TFindRec;
    Len: Integer;
begin
   
NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));
    if FindFirst(NewSearchPath + '*.*', FindRec) then
    try
        repeat
            if
(FindRec.Name <> '.') and (FindRec.Name <> '..') then if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
            begin
               
Len := GetArrayLength(Result);
                SetArrayLength(Result, Len+1);
                Result[Len] := NewSearchPath + FindRec.Name;
            end;
        until not FindNext(FindRec);
    finally
       
FindClose(FindRec);
    end;
end;


function OnlyVersion(const iStr: String): String; /// оставлять только цифры
var
   
i: Integer;
begin
   
Result := '';
    if Length(iStr) > 0 then for i := 1 to Length(iStr) do
    case
iStr[i] of
       
'.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': Result := Result + iStr[i];
    end;
end;


function OnlyWithFolder(const FolderName: String ;const Path: array of String): array of String; // оставлять только пути с именем искомой папки
var
   
i, Len: Integer;
begin
    for
i := 0 to GetArrayLength(Path)-1 do if DirExists(AddBackslash(RemoveBackslash(Path[i])) + FolderName) then
    begin
       
Len := GetArrayLength(Result);
        SetArrayLength(Result, Len+1);
        Result[Len] := Path[i];
    end;
end;



function OnlyVersionFolders(const Path: array of String): array of String; // оставлять папки только с цифрами,
var
   
i, Len: Integer;
begin
    for
i := 0 to GetArrayLength(Path)-1 do if Length( OnlyVersion(ExtractFileName(Path[i])) ) = 5 then
    begin
       
Len := GetArrayLength(Result);
        SetArrayLength(Result, Len+1);
        Result[Len] := Path[i];
    end;
end;


function GetNormalTextLen(const Text: String): Integer;
begin
    with
TLabel.Create(nil) do
    try
       
Caption := Text;
        Result := Width;
    finally
       
Free;
    end;
end;


function AskForPath(const Path: array of String): String;
var
   
AskForm: TForm;
    PathCombo: TNewComboBox;
    Len, i: Integer;
begin
   
Len := GetArrayLength(Path);
    if Len = 0 then Exit;
   
    AskForm := TForm.Create(nil);
    with AskForm do

    begin
       
Caption := 'Какую папку патчить?';
        Position := poScreenCenter;
       
        PathCombo := TNewComboBox.Create(AskForm);
        with PathCombo do
        begin
           
Parent := AskForm;
            SetBounds(ScaleX(7), ScaleY(7), ScaleX(GetNormalTextLen(Path[0]) + 25), ScaleY(23));
            Style := csDropDownList;
            for i := 0 to Len-1 do Items.Add(Path[i]);
            ItemIndex := 0;
        end;
       
        ClientWidth := ScaleX(PathCombo.Width + 16);
        ClientHeight := ScaleY(77);
       
        with TButton.Create(AskForm) do
        begin
           
Parent := AskForm;
            Left := ScaleX(7);
            Top := ScaleY(PathCombo.Top + PathCombo.Height + 16);
            Caption := SetupMessage(msgButtonOK);
            ModalResult := mrOk;
        end;
        with TButton.Create(AskForm) do
        begin
           
Parent := AskForm;
            Left := ScaleX(90);
            Top := ScaleY(PathCombo.Top + PathCombo.Height + 16);
            Caption := SetupMessage(msgButtonCancel);
            ModalResult := mrCancel;
        end;
   
        if ShowModal = mrOk then Result := PathCombo.Text;
    end;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
   
UnefInstallPath: String;
begin
    if
CurPageID = wpSelectComponents then
    begin
        if
IsComponentSelected('zvuk') then
        begin
           
UnefInstallPath := AskForPath( OnlyWithFolder('audio', OnlyVersionFolders( SearchForFolders( AddBackslash(RemoveBackslash( WizardDirValue() )) + 'res_mods') ) ) );
            Result := UnefInstallPath <> '';
            if not Result then MsgBox('No', mbError, MB_OK) else InstallPath := UnefInstallPath;
        end else Result := True;
    end else Result := True;
end;



PS: чтоб пример работал первый раз установи без компонентов

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

neorom,
вот обновлённая процедура:
читать дальше »
Код:

procedure BetterInfo();
var
   
Buff: String;
begin
   
Buff := ExpandConstant(CurrentFilename);
    StringChange(Buff, AppPath, '');
    fLabel.Caption := '{#SetupSetting("AppName")}' + Buff;
end;


Nightwishh 20-04-2013 15:37 2136389

saurn, Спасибо за помощь, пошёл собирать!

neorom 20-04-2013 17:52 2136478

Цитата:

Цитата Johny777
вот обновлённая процедура »

Процедура хорошая (даже очень), но может бить я слишком много требую, но всьо равно спрашу. Константа CurrentFilename - которая показуэт имя файла на экран, но нужна ишчо одна константа на экран, например CurrentDirname - єто имя папки в которий в нутри размещается файл CurrentFilename. Константа {#SetupSetting("AppName")} подходит, єсли єсть одни файли без папок, а когда єсть папки из файлами в нутри, тогда идет каша, замисть Help\FAQ.html видайот на єкран My Program\Help\FAQ.html. Я ишчю токой вариант, чтоби било имя папки\имя файла и не имеєт значения сколько папок и файлов єсть в нутри, но ненахожу.

Nightwishh 20-04-2013 21:13 2136564

Сдравствуйте ещё раз. Не знаете что испраить в этом коде
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if WizardSelectedComponents(False) = '' then
begin
MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK);
Result:= False;
end;
end;

чтобы при снятых с компонентов галочек, при переходе, например, с SelectProgramGroupPage на SelectDirPage, а потом вперёд не выдовалось сообщение "Ни один из компонентов не выбран". Мне раньше давали такой код, ноя его посеял. Там я помню что-то было дописано в этой строчке
Код:

if WizardSelectedComponents(False) = '' then
. Работало безотказно! Спасибо!!!

Mailchik 20-04-2013 21:38 2136581

Nightwishh,
Код:

function NextButtonClick(CurPageID: Integer): boolean;
 begin
 Result := True;
 if CurPageID = wpSelectComponents then
  if WizardSelectedComponents(False) = '' then begin
  MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK);
  Result := False;
  end;
end;


El Sanchez 20-04-2013 22:42 2136672

Цитата:

Цитата neorom
Я ишчю токой вариант, чтоби било имя папки\имя файла и не имеєт значения сколько папок и файлов єсть в нутри »

neorom, перепишите процедуру BetterInfo:
Код:

procedure BetterInfo();
var
   
Buff: String;
begin
   
Buff := ExpandConstant(CurrentFilename);
    fLabel.Caption := ExtractRelativePath(ExtractFileDir(Buff), Buff);
end;


neorom 20-04-2013 22:49 2136677

El Sanchez именно что я и хотел.
Спосибо вам за помощь El Sanchez и Johny777.

ilya_klimovich 22-04-2013 08:42 2137405

взял обычную распакованную игру весом 9 гб, через ино начал делать стандартный инсталлятор, в процессе компиляции через мин 20 после начала, выбивается окно, мол что то больше или должно быть больше чем 2100000000 байт. Подскожите кто плиз как решить эту проблемку))

Lex_from_Belarus 22-04-2013 10:09 2137429

Подскажите как правильно организовать инсталлер:
есть куча компонентов:
-Компонент1
--Компонент1.1
--Компонент1.2
--Компонент1.3
-Компонент2
-Компонент3
-Компонент4
-Компонент5
---Компонент5.1
---Компонент5.2
-Компонент6
...
-Компонент20
и т.д.

Хочу сделать так чтобы можно было добавлять/удалять компоненты без полного uninstall'a, добавить можно легко, AppModifyPath, но вот инсталлер в этот момент когда снимаешь галки говорит, что не удалит снятые с выделения компоненты. Подскажите как правильно сделать это?

saurn 22-04-2013 10:45 2137448

ilya_klimovich, размер пакета не может превышать 2 гигабайта. Разбивку на части используйте, в секции Setup
Код:

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


El Sanchez 22-04-2013 12:55 2137536

Lex_from_Belarus, использовать флаг disablenouninstallwarning для компонентов, чтобы убрать предупреждение о том, что снятая галка не приведет к удалению компонента, а удаление нужно самому организовывать через секцию [InstallDelete]. Пример:
Код:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test

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

[Components]
Name: component1; Description: component 1; Flags: disablenouninstallwarning
Name: component2; Description: component 2; Flags: disablenouninstallwarning

[Files]
Source: file1.txt; DestDir: {app}; Components: component1; Flags: ignoreversion
Source: file2.txt; DestDir: {app}; Components: component2; Flags: ignoreversion

[InstallDelete]
Type: files; Name: {app}\file1.txt; Components: not component1
Type: files; Name: {app}\file2.txt; Components: not component2


ilya_klimovich 22-04-2013 21:28 2137858

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

insombia 22-04-2013 21:36 2137866

ilya_klimovich это конечно не в тему но, юзай precomp+srep сжатие

ilya_klimovich 22-04-2013 23:26 2137952

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

audiofeel 23-04-2013 00:48 2137995

ilya_klimovich, Держи http://rghost.ru/45486177 там три батника, как раз precomp+srep+lzma и еще три варианта, ну и все, файлы и папки для сжатия кладешь в папку "packeddata" = сжимаешь ложешь рядом с серапоп (ну и скачай последнюю версию ISDone0.6final = если внимательно прочитать справку которая прилагается к ISDone0.6final можно шаг за шагом понять самое основное) О да раскаментируй для начала - ;#define PrecompInside
;#define SrepInside. потом в папке ISDone0.6final есть папка "include" а в ней папка "exe_for_PrecomInside"- дак вот там лежит фаил "precomp040.exe" - переименовываешь его на "precomp.exe" и ложешь в папку "include" = ну должно получится

ilya_klimovich 23-04-2013 09:30 2138079

isdone 0.4 подойдет? а то влом все сначла делать

Mailchik 23-04-2013 09:40 2138084

Цитата:

Цитата ilya_klimovich
а то влом все сначла делать »

Меня всегда удивляли такие люди. Ну если в лом, то зачем беретесь за что то?
А мы скажем, что нам в лом вам помогать. Сойдет?

Lex_from_Belarus 23-04-2013 11:32 2138143

El Sanchez, вы хотите сказать что нужно в ручную каждый файл прописывать? Ё-моё...

saurn 23-04-2013 12:05 2138169

Цитата:

Цитата Lex_from_Belarus
вы хотите сказать что нужно в ручную каждый файл прописывать? Ё-моё... »

Ну... inno - это "ручной" инструмент). А вообще. если компоненты расскиданы по подпапкам в корневой директории, то можно этим же способом удалять целиком подпапки:
Код:

[InstallDelete]
Type: filesandordirs; Name: {app}\comp1\*; Components: "not component1";
Type: filesandordirs; Name: {app}\comp2\*; Components: "not component2";


Lex_from_Belarus 23-04-2013 12:15 2138177

saurn, фишка в том, что в одних и тех папках могут находится разные компоненты

а что значит "not component1"?

saurn 23-04-2013 12:24 2138184

Lex_from_Belarus, ну тогда вручную, или адаптировать способ, предложенный Johny777.
Цитата:

Цитата Lex_from_Belarus
а что значит "not component1"? »

Проще говоря "если не отмечен component1"

audiofeel 23-04-2013 12:38 2138192

ilya_klimovich,
Цитата:

Цитата ilya_klimovich
isdone 0.4 подойдет? а то влом все сначала делать »

Скачайте не ленитесь "ISDone0.6final", сперва все испробуйте на "чистом", а уж потом и "картинки" добавляйте, вчитайтесь в справку к ИСДону, что он "может", чем "проще" скрипт тем надежнее.Вот я буквально полгода назад чем занимался - скачивал все готовое на Кринкелсе = ну надоело, имея перед собой кучу примеров сам кое чему "научился". свой та лучше всех, по крайней мере знаешь что и где искать

ilya_klimovich 23-04-2013 17:33 2138380

если батником izma сжимаю то все норм а если precomp+izma то вот такая обшибка

insombia 23-04-2013 18:17 2138403

ilya_klimovich не хватает оператвы

ilya_klimovich 23-04-2013 18:18 2138404

3 гига у меня

insombia 23-04-2013 18:22 2138407

ilya_klimovich значит прекомп не нашел файл который он может расжать

ilya_klimovich 23-04-2013 18:32 2138422

да я уже любые файлы закидывал и каждый раз выбивается одна и та же ошибка

audiofeel 23-04-2013 19:00 2138435

Цитата:

Цитата ilya_klimovich
да я уже любые файлы закидывал и каждый раз выбивается одна и та же ошибка »

проверил толь ко что = все три работают, попробуй закинуть файлы которые идут вместе с "PrecompInside0.23" в папке "packeddata" если ошибки нет - то разжимать в ваших файлах нечего, используй просто "среп" или любой другой,

insombia 23-04-2013 22:50 2138584

как сделать переход языка на ходу? я нашел один пример но там он не полный
http://rghost.ru/45310084

insombia 23-04-2013 23:12 2138612

и ещё одно,нужно текстурировать кнопку обзор http://rghost.ru/45507461

neorom 24-04-2013 00:21 2138633

Как добавить верний прогресс-бар (нижной - отображает общий прогресс, верхний - распаковку одного файла) с процентами рядом с каждым для обычных файлов, к єтому скрипту
читать дальше »
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: innocallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: files\*; DestDir: {app}; Flags: recursesubdirs

[Languages]
Name: Ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl

[code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
TimerID: 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';

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
if WizardForm.CurPageID = wpInstalling then with WizardForm.ProgressGauge do PercentsLabel.Caption:= Format('%s'#32'%s', ['Установка игры:', FormatFloat('0.0 %', (Position*100)/Max)]);
End;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.DirEdit.Left;
Top:= ScaleY(WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 30);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Alignment := taCenter;
Font.Style:= [fsBold, fsItalic];
Font.Size:= 14;
Font.Name:= 'Times New Roman';
Font.Color:= ClMaroon;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then TimerID:= SetTimer(0, 0, 500 {Установка игры}, WrapTimerProc(@MyTimerProc, 4));
end;

saurn 24-04-2013 00:52 2138644

Цитата:

Цитата neorom
Как добавить верний прогресс-бар (нижной - отображает общий прогресс, верхний - распаковку одного файла) с процентами рядом с каждым для обычных файлов, к єтому скрипту »

Средствами Inno? Создать кастомный прогресс бар, и таймер, который будет передвигать прогресс бар основываясь на размере копируемого файла(наверное), и т.д. Есть где-то пример реализации подобного, но там, если я не путаю, учитываются только файлы лежащие в корневом каталоге, тоесть подпапки в расчет не берутся. Все файлы нужно раскидывать по каталогам вручную, в секции Files, посредством DestDir, и если файлов сотни, а то и тысячи... Вообщем игра не стоит свеч.

Gnom_aka_Lexander 24-04-2013 13:16 2138854

neorom, вот, поправлял как-то существующий пример до удобоваримого. на 100% корректно сделать невозможно по множеству причин. главная из них - прегресс рассчитывается исходя из размера сжатого файла.
скачать

neorom 24-04-2013 21:49 2139085

Цитата:

Цитата Gnom_aka_Lexander
прегресс рассчитывается исходя из размера сжатого файла »

А эсли не жимать файли, то получеться.

Может кто подскажет, где эсть информация как роботать з inno setup китайськая версия в Редакторе форм.

audiofeel 25-04-2013 06:13 2139185

Доброе утро, Всем. в примере "GameuxInstallHelper.iss" реализованно все для одного ГДФБинари, "проблема" в том что их два, один для MP второй для SP - как быть, просто "повторить" - "if CurStep = ssPostInstall then begin"
и "if CurUninstallStep = usUninstall then begin" просто вписывая данные для каждого отдельно. как бы это сделать все правильно что ли , что бы при удалении не было эррор

saurn 25-04-2013 06:19 2139188

audiofeel, я ведь вам уже говорил, объявлять дважды один и тот же шаг установки или деинсталяции(CurStep, CurUninstallStep) не имеет смысла. Объявляйте все процедуры в порядке выполнения внутри шага. Покажите, что там за пример, а то я, что-то у себя не нахожу.

audiofeel 25-04-2013 06:26 2139190

saurn, У ГДФ "названия" разные и "MainExe" разные
пример
читать дальше »
Код:

type
TGUID = record
Data1: Cardinal;
Data2,
Data3: Word;
Data4: array [0..8] of char;
end;

function GenerateGUID(var GUID: TGUID): Cardinal;
  external 'GenerateGUID@files:GameuxInstallHelper.dll stdcall setuponly';
function AddToGameExplorer(Binary: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal;
  external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly';
function CreateTask(InstallType: Integer; var GUID: TGUID; TaskType: Integer; TaskNumber: Integer; TaskName: String; Binary: String; Parameters: String): Cardinal;
  external 'CreateTaskA@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(Binary: String; var GUID: TGUID): Cardinal;
  external 'RetrieveGUIDForApplicationA@{app}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal;
  external 'RemoveFromGameExplorer@{app}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveTasks(var GUID: TGUID): Cardinal;
  external 'RemoveTasks@{app}\GameuxInstallHelper.dll stdcall uninstallonly';

const
  PlayTask = 0;
  SupportTask = 1;

var
  GUID: TGUID;

procedure CurStepChanged2(CurStep: TSetupStep);
var
  Binary, MainExe: String;
begin
  if CurStep = ssInstall then
    GenerateGUID(GUID);

  if CurStep = ssPostInstall then begin
    Binary := ExpandConstant('{app}\GDFBinary.dll');
    MainExe := ExpandConstant('{app}\Binaries\MoHUpdater.exe');
    AddToGameExplorer(Binary, ExpandConstant('{app}'), 3, GUID);
    CreateTask(3, GUID, PlayTask, 0, 'Play', MainExe, '');
    CreateTask(3, GUID, PlayTask, 1, 'Medal of Honor (TM) - Повторно авторизуйте данное устройство', 'Binaries\moh.exe', ' -ead_gl_remove');
    CreateTask(3, GUID, PlayTask, 2, 'Readme', 'Support\readme.ru.txt', '');
    CreateTask(3, GUID, PlayTask, 3, 'EA EULA', 'Support\EAEula\ru_eula.rtf', '');
    CreateTask(3, GUID, PlayTask, 4, 'Техническая поддержка', 'Support\EA Help\Electronic_Arts_Technical_Support.htm', '');
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Binary: String;
  GUID: TGUID;
begin
  if CurUninstallStep = usUninstall then begin
    Binary := ExpandConstant('{app}\GDFBinary.dll');
    RetrieveGUIDForApplication(Binary, GUID);
    RemoveFromGameExplorer(GUID);
    RemoveTasks(GUID);
    UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll'));
  end;
end;


saurn 25-04-2013 06:52 2139194

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

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

#define GDFSP "{app}\GDFsp.dll"
#define GDFMP "{app}\GDFmp.dll"

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

[Files]
Source: GameuxInstallHelper.dll; DestDir: {app}; Flags: overwritereadonly

[Code]
type
  TGUID = record
    D1: Cardinal;
    D2: Word;
    D3: Word;
    D4: Array [0..8] of Byte;
  end;

function AddToGameExplorer(BinaryPatch: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal; external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(BinaryPatch: String; var GUID: TGUID): Cardinal; external 'RetrieveGUIDForApplicationA@{app}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal; external 'RemoveFromGameExplorer@{app}\GameuxInstallHelper.dll stdcall uninstallonly';

var
  GUID: TGUID;
  GDFSP, GDFMP: String;
 
procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall:
    begin
      GDFSP := ExpandConstant('{#GDFsp}');
      GDFMP := ExpandConstant('{#GDFmp}');
      AddToGameExplorer(GDFSP, ExpandConstant('{app}'), 3, GUID);
      AddToGameExplorer(GDFMP, ExpandConstant('{app}'), 3, GUID);
    end;
  end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  case CurUninstallStep of
    usUninstall:
    begin
      GDFSP := ExpandConstant('{#GDFsp}');
      GDFMP := ExpandConstant('{#GDFmp}');
      RetrieveGUIDForApplication(GDFSP, GUID);
      RetrieveGUIDForApplication(GDFMP, GUID);
      RemoveFromGameExplorer(GUID);
      UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll'));
    end;
  end;
end;


audiofeel 25-04-2013 09:00 2139215

saurn, проверил - создается один ярлык в Game Explorer, причем пустой не кликабельный именно на второй GDFBinary2.DLL (для мульта), но зато для всех пользователей (ну это так к слову)
читать дальше »
Код:

type
  TGUID = record
    D1: Cardinal;
    D2: Word;
    D3: Word;
    D4: Array [0..8] of Byte;
  end;

function AddToGameExplorer(BinaryPatch: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal;
  external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(BinaryPatch: String; var GUID: TGUID): Cardinal;
  external 'RetrieveGUIDForApplicationA@{app}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal;
  external 'RemoveFromGameExplorer@{app}\GameuxInstallHelper.dll stdcall uninstallonly';

var
  GUID: TGUID;
  GDFSP, GDFMP: String;

procedure CurStepChanged2(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall:
    begin
      GDFSP := ExpandConstant('{app}\GDFBinary.dll');
      GDFMP := ExpandConstant('{app}\GDFBinary2.dll');
      AddToGameExplorer(GDFSP, ExpandConstant('{app}'), 3, GUID);
      AddToGameExplorer(GDFMP, ExpandConstant('{app}'), 3, GUID);
    end;
  end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  case CurUninstallStep of
    usUninstall:
    begin
      GDFSP := ExpandConstant('{app}\GDFBinary.dll');
      GDFMP := ExpandConstant('{app}\GDFBinary2.dll');
      RetrieveGUIDForApplication(GDFSP, GUID);
      RetrieveGUIDForApplication(GDFMP, GUID);
      RemoveFromGameExplorer(GUID);
      UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll'));
    end;
  end;
end;


saurn 25-04-2013 09:59 2139237

audiofeel, да нет, все добавляется корректно. есть косяки с удалением(остается мертвый ярлык) пока нет времени ковырять, может разберетесь раньше. Может кто более сведущий нам подскажет, я-то тоже не особо спец. На счет пустых ярлыков, смотрите в сторону бинарников.

insombia 25-04-2013 18:13 2139545

кто-то может сделать так чтобы 1 кнопка переводила весь язык,а то у меня там 2 кнопки,думаю кто-то разберется
http://rghost.ru/45545533

saurn 28-04-2013 07:05 2140929

Всем привет! Наставьте, пожалуйста на путь истинный. Как извлечь имя(тип) файловой системы выбранного раздела, при выборе папки установки и записать полученное значение в виде текста(лейбла) на странице мастера. Ну, тоесть, как извлечь понятно - GetVolumeInformation и т.д - , и тут возникает проблема: упорно не желает определять тип файловой системы раздела "C:\". Делал, фактически, по следующему принципу:
читать дальше »
Код:

function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';

function DelSP(string: string): string;
begin
  while (Pos('  ', String) > 0) do
  Delete(String, Pos('  ', String), 1);
  Result:= Trim(String);
end;

...
                FileSystemName:= StringOfChar(' ', 32);
                GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
                FileSystemName:= DelSp(FileSystemName);
...


Johny777 28-04-2013 13:13 2141077

insombia,
Проверяй стоку кнопки например:
читать дальше »
Код:

procedure OnChange(Sender:TObject);
begin
    case
TButton(Sender).Caption of
       
SetupMessage(msgButtonNext):
        begin
           
MsgBox('A', mbInformation, MB_OK);
            TButton(Sender).Caption := SetupMessage(msgButtonBack);
        end;
        SetupMessage(msgButtonBack):
        begin
           
MsgBox('B', mbInformation, MB_OK);
            TButton(Sender).Caption := SetupMessage(msgButtonNext);
        end;
    end;
end;
                                                                   
procedure InitializeWizard;
begin
   
WizardForm.NextButton.OnClick := @DirEditOnChange;
end;


заместо SetupMessage(msgButtonNext) и SetupMessage(msgButtonBack) 'твои 2 названия кнопки', а вместо месседжбоксов действия
=============================================================================================
saurn,
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
   
MAX_PATH = 260;

function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';

procedure DirEditOnChange(Sender:TObject);
var
   
VolumeName, FileSystemName, DriveLetter: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
begin
   
VolumeName := StringOfChar(#32, MAX_PATH);
    FileSystemName := StringOfChar(#32, MAX_PATH);
    DriveLetter := ExtractFileDrive(TEdit(Sender).Text);
    GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH)
    WizardForm.Caption := FileSystemName;
end;
                                                                   
procedure InitializeWizard;
begin
   
WizardForm.DirEdit.OnChange := @DirEditOnChange;
    DirEditOnChange(WizardForm.DirEdit);
end;



PS: в данном случае DelSP(...) не нужна, если нужно то Trim(...) http://www.delphisources.ru/pages/fa.../Trim.php.html

insombia 28-04-2013 21:01 2141308

странности с isexec,есть файл размером в 3 гб,установка прошла нормально,но папка с игрой пустая

ilya_klimovich 28-04-2013 22:23 2141351

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

insombia 28-04-2013 23:01 2141361

ilya_klimovich их нужно юзать для распаковки в исдоне или isexec

saurn 29-04-2013 09:42 2141507

Johny777, спасибо за направление по верному пути :) Всё же существующая проблема не исчезла, данные о файловой системе системного раздела(в моем случае "С") не выводятся, строка пустая. С другими разделами, а так же флешками и т.д. проблем нет. На текущий момент файловая система системного раздела определяется только, если указать неизменяемую литеру:
Код:

GetVolumeInformation('C:\', VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH)
Немогу понять, что ему нехватает(

nik1967 29-04-2013 10:22 2141526

saurn, а не может быть такое - физический диск разбит на несколько логических, но скрипт показывает файловую систему только физического диска? У меня данный пример показывает файловую систему диска C:\, но не показывает диска D:\(логического). У меня физический диск разбит на 2 логических.

saurn 29-04-2013 10:36 2141534

nik1967, диск разбит на три раздела - С, D, E, соответственно. Все разделы основные, логических нет. В том и дело, что скрипт показывает файловую систему D и E, но запинается на C.

Johny777 29-04-2013 13:11 2141611

saurn, nik1967,
спасибо, что нашли ошибки!
Теперь вроде работает, замени в коде что я дал эти строки:

DriveLetter := ExtractFileDrive(TEdit(Sender).Text);
GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH)
WizardForm.Caption := FileSystemName;

на:

DriveLetter := AddBackslash(ExtractFileDrive(TEdit(Sender).Text));
if GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH) then WizardForm.Caption := Trim(FileSystemName);

PS: кажись функция не успевала отработать(маловероятно) и не хватало слэша(!), к тому же мы заполняем буфер 260-ю пробелами и поэтому в конечном итоге не помешает Trim()

=========
предлагаю вот этот код, может он лучше подойдёт?
читать дальше »
Код:

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

const
   
DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = 2;
    DRIVE_FIXED = 3;
    MAX_PATH = 260;
    SHGFI_ICON = $100;
    SHGFI_SMALLICON = $1;
    SHGFI_DISPLAYNAME = $200;
    SHGFI_TYPENAME = $400;
    LVM_SETEXTENDEDLISTVIEWSTYLE = $1036;
    LVS_EX_FULLROWSELECT = $20;

    LVM_FIRST = $1000;
    LVSCW_AUTOSIZE_USEHEADER = -2;
    LVM_SETCOLUMNWIDTH = LVM_FIRST + 30;

type
   
_SHFILEINFO = record
       
hIcon: HICON;
        iIcon: Integer;
        dwAttributes: DWORD;
        szDisplayName: array [0..MAX_PATH-1] of Char;
        szTypeName: array [0..79] of Char;
    end;

    _ULARGE_INTEGER = record
       
LowPart: Longint;
        HighPart: DWORD;
    end;

    DriveInfo = record
       
DriveName: String;
        DriveFileSystemName: String;
        DriveSize: Extended;
        DriveFreeSize: array [0..1] of Extended;
        DriveType: String;
        DriveIcon: _SHFILEINFO;
    end;


function SHGetFileInfo(pszPath: String; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#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 CharArrayToString(cArray: array of Char): String;
begin
   
Result := '';
    while cArray[Length(Result)] <> #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
end;

function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
   
Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
   
i, e: Integer;
    iIcon: WORD;
    UndefDriveLetter: String;
    DriveType: UINT;
    DrivePath: String;
    VolumeName, FileSystemName: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
    FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
begin
    for
i := 67 to 90 do // Loop from C..Z to determine available drives
   
begin
       
UndefDriveLetter := Chr(i) + ':\';
        DriveType := GetDriveType(UndefDriveLetter);
        case DriveType of
           
DRIVE_REMOVABLE, DRIVE_FIXED: begin
               
VolumeName := StringOfChar(#32, MAX_PATH);
                FileSystemName := StringOfChar(#32, MAX_PATH);
                GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
                GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
                SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
                e := GetArrayLength(DriveArray)-1;
                SHGetFileInfo(UndefDriveLetter, FILE_ATTRIBUTE_DIRECTORY, DriveArray[e].DriveIcon, sizeof(DriveArray[e].DriveIcon), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_DISPLAYNAME);
                DriveArray[e].DriveName := CharArrayToString(DriveArray[e].DriveIcon.szDisplayName);
                DriveArray[e].DriveFileSystemName := FileSystemName;
                DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
                DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes);
                if DriveArray[e].DriveSize > 0 then DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]*100/DriveArray[e].DriveSize;
                DriveArray[e].DriveType := CharArrayToString(DriveArray[e].DriveIcon.szTypeName);
            end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
    if
Assigned(TListView(Sender).Selected) then
       
WizardForm.DirEdit.Text := AddBackSlash(Copy(TListView(Sender).Selected.Caption, Pos('(', TListView(Sender).Selected.Caption)+1, 2)) + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;

procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
   
TListView(Sender).Tag := Column.Index;
    with TListView(Sender) do
    begin
        if
DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
        AlphaSort;
    end;
end;

procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
    with
TListView(Sender) do
    begin
        if
Tag = 0 then
           
Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
        else
           
Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
    end;
end;

procedure InitializeWizard;
var
   
ReadyArray: array of DriveInfo;
    DriveListView: TListView;
    NewColumn: TListColumn;
    ListItem: TListItem;
    ImgList: TImageList;
    i, e: Integer;
    ico: TIcon;
begin
   
WizardForm.OuterNotebook.Hide;
    WizardForm.Width := ScaleX(700);
    WizardForm.Bevel.Hide;
    WizardForm.DirEdit.Parent := WizardForm;
    WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));

    GetDrivesInfo(ReadyArray);
    e := GetArrayLength(ReadyArray)-1;

    DriveListView := TListView.Create(nil);
    with DriveListView do
    begin
       
Parent := WizardForm;
        ViewStyle := vsReport;
        ReadOnly := True;

        SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
        OnClick := @DriveListViewOnClick;
        OnColumnClick := @DriveListViewColumnClick;
        OnCompare := @DriveListViewOnCompare;
       
        SendMessage(Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);

        ImgList := TImageList.Create(DriveListView);
        ImgList.BkColor := Color;
        for i := 0 to e do
        begin
           
ico := TIcon.Create;
            ico.Handle := ReadyArray[i].DriveIcon.hIcon;
            ImgList.AddIcon(ico);
            ico.Free;
        end;
        SmallImages := ImgList;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Имя';
        NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Файловая система';
        NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Ёмкость';
        NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Свободно';
        NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Тип';
        NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;

        for i := 0 to e do
        begin
           
ListItem := Items.Add;
            with ListItem do
            begin
               
Caption := ReadyArray[i].DriveName;
                SubItems.Add(ReadyArray[i].DriveFileSystemName);
                SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
                SubItems.Add(Format('%s (%d%%)', [BytesToSize(ReadyArray[i].DriveFreeSize[0]), Round(ReadyArray[i].DriveFreeSize[1])]));
                SubItems.Add(ReadyArray[i].DriveType);
                ImageIndex := i;
            end;
        end;
    end;
end;


если пригодился то поставьте El Sanchez-у спасибо
http://forum.oszone.net/post-2030337-1311.html

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

я горжусь своим 555-м сообщением! :)

insombia 29-04-2013 20:05 2141861

странности с инно происходят,когда через инно сделал сетап,то во время установки такие ошибки идут http://i47.fastpic.ru/big/2013/0429/...b7d871fcea.jpg
и иногда просто могут быть ошибки

saurn 29-04-2013 20:56 2141884

insombia, дословно, это означает "внешнее исключение". Иными словами смотрите в сторону процедур и функций вызываемых из внешних библиотек. Некоторые библиотеки( например IsUtils, get_hw_caps) используют WMI (Windows Management Instrumentation), которая есть в любой форточке, кроме 98. И соответственно, для их корректной работы необходимо, чтобы была включена сама WMI и ряд связанных с ней сервисов. Ну, а если используется какая-нибудь сборка системы ,где черезмерно умный сборщик отключил ненужные по его мнению службы, подобных ошибок не избежать. Inno тут ни причем. Так же, вполне вероятно, что просто ошибка в скрипте.

insombia 29-04-2013 21:21 2141899

saurn могу дать скрипт,мож посмотреть http://rghost.ru/45646441
p.s. да,он с krinkels'а но я его переделаю под себя

ilya_klimovich 29-04-2013 22:38 2141951

как прописать в isdone чтобы при установке игры из srep файла вылез pcf а потом prack? что здесь не так
Цитата:

if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\1.srep'), ExpandConstant('{app}\1.pcf'), '', true, CallBack ) then break;

saurn 30-04-2013 00:28 2141998

Johny777, спасибо. Склеил простенький скрипт на проверку файловой системы с выводом имени оной в TNewStaticText на SelectDirPage :) Может, кому сгодится:
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

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

[Code]
const
 
MAX_PATH          = 260;
  TARGET_FILE_SYSTEM = 'NTFS';

function GetVolumeInformation(lpRootPathName: String; lpVolumeNameBuffer: String; nVolumeNameSize: DWORD; lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';

var
 
FileSystemLabel, FileSystemLabel2: TNewStaticText;

function ExtractFileSystemName(const DriveLetter: string): string;
var
 
VolumeName, FileSystemName: String;
  ComponentLength, SerialNumber, FileSystemFlags: DWORD;
begin
 
VolumeName := StringOfChar(#32, MAX_PATH);
  FileSystemName := StringOfChar(#32, MAX_PATH);
  DriveLetter := AddBackslash( ExtractFileDrive(WizardDirValue()) );
  GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
  Result := Trim(FileSystemName);
end;

procedure ObjectOnChange(Sender: TObject);
var
FileSystemType: String;
begin
  case
TEdit(Sender) of
   
WizardForm.DirEdit:
    begin
     
FileSystemLabel2.Caption := ExtractFileSystemName(FileSystemType);
      WizardForm.NextButton.Enabled := (ExtractFileSystemName(FileSystemType) = TARGET_FILE_SYSTEM);
      if ExtractFileSystemName(FileSystemType) = TARGET_FILE_SYSTEM then
     
FileSystemLabel2.Font.Color := clBlack else FileSystemLabel2.Font.Color := clRed;
    end;
  end;
end;

procedure InitializeWizard();
begin
  with
WizardForm do
  begin
   
DirEdit.OnChange := @ObjectOnChange;
    FileSystemLabel := TNewStaticText.Create(nil);
    with FileSystemLabel do
    begin
     
Parent := SelectDirPage;
      SetBounds(WizardForm.DiskSpaceLabel.Left, WizardForm.DiskSpaceLabel.Top - 18, 0, 0);
      AutoSize := True;
      Caption := 'Файловая система:';
    end;

    FileSystemLabel2 := TNewStaticText.Create(nil);
    with FileSystemLabel2 do
    begin
     
Parent := SelectDirPage;
      SetBounds(FileSystemLabel.Left + 100, FileSystemLabel.Top, 0, 0);
      AutoSize := True;
    end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case
CurPageID of
   
wpSelectDir: ObjectOnChange(WizardForm.DirEdit);
  end;
end;


vint56 30-04-2013 13:08 2142225

ilya_klimovich
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\1.srep'), ExpandConstant('{app}\1.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\1.pcf'), ExpandConstant('{app}\1.prack'), true) then break;

ilya_klimovich 30-04-2013 15:45 2142332

Прописываю вот так
Цитата:

if not ISPrecompExtract ( 0, OveralPct, 0, ExpandConstant('{app}\1.pcf'), ExpandConstant('{app}\1.rpack'), '', true, CallBack ) then break;
потом в процессе установки выбивается мол не верно задан файл для ISPrecompExtract

vint56 30-04-2013 16:02 2142346

ilya_klimovich, а у тебя какой на выходе файл после srep вот тот и надо писать ты же написал 1.pcf

ilya_klimovich 30-04-2013 16:07 2142349

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

insombia 30-04-2013 16:51 2142379

ilya_klimovich зачем этот гемор? тебе же давали вроде скрипт для консольного сжатия srep+precomp

ilya_klimovich 30-04-2013 16:54 2142382

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

vint56 30-04-2013 17:44 2142416

ilya_klimovich cls фильтры и не каких временых файлов не надо что уменьшает время установки
Вот все для сжатия http://rghost.ru/45663041 только нужен isdone 6

ilya_klimovich 01-05-2013 11:51 2142758

расскажите кто как пользоваться define records, вплоть до мелочей)

Gnom_aka_Lexander 01-05-2013 12:04 2142766

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

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

#define records
(т.е. необходимо поставить точку с запятой в начале этой строки);
б) компилим проект и запускаем на установку. Это и будет нашим тестовым проходом. Все операции должны дойти до конца и завершиться удачно. Прогрессбар будет зашкаливать и все компоненты будут извлечены вне зависимости от того выбраны они, или нет. Все так и должно быть!
в) после тестового прогона в указанной папке создастся файл records.inf (имя и путь назначается в процедуре инициализации. О ней см. "подробное описание функций" ниже), его необходимо добавить в проект, раскомметировав, или добавив в начале скрипта строку:

#define records

Так же стоит отметить, что если сам скрипт находится в папке отличной от той, в которую компилится проект (например в скрипте NFS:Undercover откомпиленный файл сохраняется в Output\setup.exe), то records.inf создастся в папке с setup.exe и его необходимо будет перенести непосредственно к скрипту, или же подправить в секции [Files] его истинное расположение, например:

#ifdef records
Source: Output\records.inf; DestDir: {tmp}; Flags: dontcopy
#endif
г) снова откомпилить проект.
После этого инсталлер готов к работе.
При запуске процесс выполнения операций будет равномерно и корректно отображаться на прогрессбаре.

Что именно тут может быть непонятно?

ilya_klimovich 01-05-2013 12:44 2142779

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

Gnom_aka_Lexander 01-05-2013 14:24 2142816

ilya_klimovich, покажи ту часть, где распаковка и я покажу, где у тебя косяк.

habib2302 01-05-2013 15:24 2142843

Доброе время суток. дайте мне пожалуйста полный скрипт на распаковку .arc архивов, учитывая выбранные компоненты.

Gnom_aka_Lexander 01-05-2013 15:56 2142859

saurn, Андрей (Shegorat) давно не обновлял модуль. если собираешься использовать этот модуль, есть смысл связаться с ним лично.

habib2302 01-05-2013 16:13 2142864

saurn, а какая версия HWREQ модуля?
у меня есть версия 1.11

insombia 01-05-2013 17:17 2142898

нужно наложить транспорант(прозрачность) на текст,там на 2 странице все будет видно
http://rghost.ru/45685934

ilya_klimovich 01-05-2013 19:14 2142932

Цитата:

if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\setup-1.bin'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\setup-2.bin'), ExpandConstant('{app}'), false,CallBack, '', '', '') then break;
if not ISArcExtract ( 0, OveralPct, 0, ExpandConstant('{src}\setup-3.bin'), ExpandConstant('{app}\DI\Data'), false,CallBack, '', '', '') then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_buildinginterior_b_PC.srep'), ExpandConstant('{app}\DI\Data\bs_buildinginterior_b_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_buildinginterior_b_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_buildinginterior_b_PC.rpack'), true, CallBack ) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_buildinginterior_PC.srep'), ExpandConstant('{app}\DI\Data\bs_buildinginterior_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_buildinginterior_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_buildinginterior_PC.rpack'), true, CallBack ) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_jungle_b_PC.srep'), ExpandConstant('{app}\DI\Data\bs_jungle_b_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_jungle_b_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_jungle_b_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_jungle_high_PC.srep'), ExpandConstant('{app}\DI\Data\bs_jungle_high_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_jungle_high_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_jungle_high_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_jungle_PC.srep'), ExpandConstant('{app}\DI\Data\bs_jungle_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_jungle_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_jungle_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_laboratory_PC.srep'), ExpandConstant('{app}\DI\Data\bs_laboratory_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_laboratory_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_laboratory_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_military_quarters_PC.srep'), ExpandConstant('{app}\DI\Data\bs_military_quarters_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_military_quarters_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_military_quarters_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_quarantine_PC.srep'), ExpandConstant('{app}\DI\Data\bs_quarantine_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_quarantine_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_quarantine_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_ship_PC.srep'), ExpandConstant('{app}\DI\Data\bs_ship_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_ship_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_ship_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_town_PC.srep'), ExpandConstant('{app}\DI\Data\bs_town_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_town_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_town_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_tunnels_PC.srep'), ExpandConstant('{app}\DI\Data\bs_tunnels_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\bs_tunnels_PC.pcf'), ExpandConstant('{app}\DI\Data\bs_tunnels_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\menuback_PC.srep'), ExpandConstant('{app}\DI\Data\menuback_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\menuback_PC.pcf'), ExpandConstant('{app}\DI\Data\menuback_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\weapons_PC.srep'), ExpandConstant('{app}\DI\Data\weapons_PC.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\weapons_PC.pcf'), ExpandConstant('{app}\DI\Data\weapons_PC.rpack'), true, CallBack) then break;
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\DI\Data\music_stream.srep'), ExpandConstant('{app}\DI\Data\music_stream.xwb'), '', true, CallBack ) then break;
Показываю

Gnom_aka_Lexander 01-05-2013 19:15 2142933

insombia, уж от тебя такого вопроса не ожидал.. честно... это-ж классика. два варианта - либо скрываем родные статик-тексты и вместо них создаем лейблы с transparent:=true;, либо компилим на юникоде, где у статиков есть свойство transparent.

Цитата:

Цитата ilya_klimovich
Показываю »

мдеээээ.............
OveralPct - эт че за? (простите мой французкий, но на самом деле - что это за ...)
далее. да, это цитата, но я помню, в том сообщении пара функций была с первым параметром, отличным от нуля. беда, в общем-то была именно там.

insombia 01-05-2013 19:20 2142935

Gnom_aka_Lexander спс,у меня то анси стоит,теперь ясно почему такая беда случилась

ilya_klimovich ты что решил игру по файлам сжать?зачем этот гемор,ведь проще через инсайды сжать сразу все эти файлы в 1 архив

Gnom_aka_Lexander 01-05-2013 19:23 2142937

insombia, советую все-же первый вариант. ибо свойство transparent у статиков в юникоде работает только если не менять свойства шрифта. либо если свойства шрифта не отличаются от свойств шрифта главной формы.
Цитата:

Цитата insombia
зачем этот гемор,ведь проще через инсайды сжать сразу все эти файлы в 1 архив »

не всегда. раз уж пошел такой оффтоп, посмотри репак S.T.A.L.K.E.R. - Народная солянка(GSC&AMK) (RUS) [LossLess RePack] от R.G. Revenants чтоб уместить 13 с лишним гиг на двд5 - одним архивом там мне было вообще никак не обойтись. причем это дело делалось принципиально без различных секретных тулз.

valyok666 01-05-2013 19:24 2142939

Цитата:

Цитата insombia
нужно наложить транспорант(прозрачность) на текст,там на 2 странице все будет видно
http://rghost.ru/45685934 »

Не забыл ли ты ещё про модуль Transparent?

Gnom_aka_Lexander 01-05-2013 19:27 2142942

Цитата:

Цитата valyok666
Не забыл ли ты ещё про модуль Transparent? »

одно слово - мерцает...

ilya_klimovich 01-05-2013 19:32 2142948

Цитата:

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

insombia 01-05-2013 19:36 2142950

valyok666 конечно же нет :) ,у меня была версия инно которая его не принимала

Gnom_aka_Lexander 01-05-2013 19:36 2142951

Цитата:

Цитата ilya_klimovich
по подробнее можно »

Можно. Проекты только по ссылке. любые ссылки ведущие куда-то еще - 100% фейк.

ilya_klimovich 01-05-2013 19:45 2142955

за способ конечно спасибо, но все равно как мне решить мою проблему?

insombia 01-05-2013 19:55 2142960

ilya_klimovich какую проблему?

ilya_klimovich 01-05-2013 22:00 2143011

insombia на прошлой страничке описывал

insombia 01-05-2013 22:10 2143018

ilya_klimovich тебе же сказали юзай packers show

ilya_klimovich 01-05-2013 22:17 2143023


insombia
не не это, просто я не могу понять почему при закоментировании define records распаковываются все файлы, а при раскоментировании только часть

Nightwishh 01-05-2013 22:26 2143028

Ребят, а можно ли как- нибудь подключить звуковые эффекты для кнопок, типа Click.wav и WFEnter.wav, только без Ботвы. Через BASS.dll например, или как-то по-другому. Спасибо!

insombia 01-05-2013 22:30 2143032

ilya_klimovich справку к исдону читай

ilya_klimovich 01-05-2013 22:34 2143035

insombia читал, все делаю в точности как там написано и вот такая трабла

saurn 02-05-2013 15:40 2143277

Цитата:

Цитата habib2302
Доброе время суток. дайте мне пожалуйста полный скрипт на распаковку .arc архивов, учитывая выбранные компоненты. »

Собственно, ISDone
Цитата:

Цитата habib2302
у меня есть версия 1.11 »

Ага, она самая. Это самая последняя.

valyok666 02-05-2013 16:40 2143313

Цитата:

Цитата Nightwishh
Ребят, а можно ли как- нибудь подключить звуковые эффекты для кнопок, типа Click.wav и WFEnter.wav, только без Ботвы. Через BASS.dll например, или как-то по-другому. Спасибо! »

В примерах botva есть примеры вроде

Johny777 02-05-2013 17:17 2143333

Nightwishh, http://krinkels.org/showpost.php?p=12678&postcount=667

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

saurn, Касательно определения звуковой карты через bass.dll попробуй, вот пример возвращает список аудиокарт:

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

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: bass.dll; Flags: dontcopy


[code  ]
type
   
BASS_DEVICEINFO = record
       
name: String;    // description
       
driver: String// driver
       
flags: DWORD;
    end;

function BASS_Stop: BOOL; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: BOOL; external 'BASS_Free@files:bass.dll stdcall';
function BASS_GetDeviceInfo(device: DWORD; var info: BASS_DEVICEINFO): BOOL; external 'BASS_GetDeviceInfo@files:bass.dll stdcall';
function waveOutGetNumDevs: UINT; external 'waveOutGetNumDevs@winmm.dll stdcall';
function BASS_Init(device: Longint; freq, flags: DWORD; win: HWND; clsid: Longint): BOOL; external 'BASS_Init@files:bass.dll stdcall';

function GetSoundDevices(): array of String;
var
   
di: BASS_DEVICEINFO;
    i, Len: Integer;
begin
   
BASS_Init(-1, 44100, 0, 0, 0);
    try
        for
i := 1 to waveOutGetNumDevs do if BASS_GetDeviceInfo(i, di) then
        begin
           
Len := GetArrayLength(Result);
            SetArrayLength(Result, Len+1);
            Result[Len] := di.name;
        end;
    finally
       
BASS_Stop;
        BASS_Free;
    end;
end;


procedure InitializeWizard();
var
   
TestArray: array of String;
    i: Integer;
begin
   
TestArray := GetSoundDevices();
    for i := 0 to GetArrayLength(TestArray)-1 do MsgBox(TestArray[i], mbInformation, MB_OK);
end;



wertulll 05-05-2013 13:24 2144728

Всем привет ! Ребят подскажите пример скрипта для добавления файлов по пути C:\Users\Djinn\AppData\Roaming?

vint56 05-05-2013 13:40 2144735

wertulll {userappdata}

wertulll 05-05-2013 14:00 2144746

vint56, спасибо за ответ (но я не совсем понял :) мне бы именно пример скрипта бы увидеть с этой константой (как что и куда прописывать (просто я в этом деле новичёк :) я хочю свою лицензию с Assassin's Creed Brotherhood пере паковать и вшить дополнения (а они находятся по этому пути C:\Users\Djinn\AppData\Roaming\Ubisoft\Assassin's Creed Brotherhood\Saves

файл "OPTIONS"

vint56 05-05-2013 14:08 2144751

wertulll
читать дальше »
#define MyAppName "Assassin's Creed Brotherhood"
#define MyAppVersion "1.03"
#define MyAppExeName "ACBSP.exe"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
SlicesPerDisk=1 // на сколько дисков
DiskSpanning=true
DiskSliceSize=736000000 // размер деления на диски

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Assassin's Creed Brotherhood\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "OPTIONS.txt"; DestDir: "{userappdata}"; Flags: ignoreversion

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

insombia 05-05-2013 14:48 2144764

а можно иконку убить для setup? именно чтобы в инсталле она сбоку не висела

insombia 05-05-2013 16:58 2144825

wertulll примерно так
Source: "Ubisoft\*"; DestDir: "{userappdata}"; Flags: ignoreversion

wertulll 05-05-2013 18:25 2144881

insombia,
вышло только вот таким макаром
Source: DLC\*; DestDir: "{userappdata}/Ubisoft/Assassin's Creed Brotherhood/Saves"; Flags: ignoreversion

а есть константы для добавления файлов в папки( Сохраненные игры,Изображения,Мои видеозаписи и тд>>>>>>?

vint56 05-05-2013 18:54 2144897

wertulll, Константы из справки
читать дальше »
Главную роль в скрипте играют константы. Константы всегда заключаются в фигурные скобки { }. Инсталлятор (или деинсталлятор) присваивает константам значения, котроые определяются пользователем, либо опираясь на конфигурацию системы. Например, {win} будет воспринята компилятором как "C:\WINDOWS", если ОС установлена в эту папку.

Символ "{" рассматривается как начало константы. Если требуется ввести "{", наберите ее два раза. (You do not need to double "}" characters.)

Если за константой следует обратный слеш ("\"), инсталлятор его автоматически удалит, если константа уже оканчивается на обратный слеш. Например, если константа {const} имеет значение "C:\", а мы введем {constantname}\filename, в конечном счете получится "C:\filename", а не "C:\\filename", как должно быть по логике. Если требуется вывести именно "C:\\filename", обратный слеш придется заключить в фигурные скобки: {const}{\}\filename.

Список поддерживаемых констант.

Константы папок
{app}
Папка, куда устанавливается приложение. Она выбирается пользователем в окне Выбор папки назначения при установке.
Например: если Вы ввели {app}\MYPROG.EXE в значение параметра Source и пользователь пожелал установить Вашу программу в "C:\MYPROG", на выходе получится "C:\MYPROG\MYPROG.EXE".

{win}
Папка, где установлена Windows.
Например: ввели {win}\MYPROG.INI , папка Windows "C:\WINDOWS", на выходе "C:\WINDOWS\MYPROG.INI".

{sys}
Системная папка Windows.
Например: ввели {sys}\CTL3D32.DLL системная папка Windows "C:\WINDOWS\SYSTEM", на выходе "C:\WINDOWS\SYSTEM\CTL3D32.DLL".

На 64-разрядном Windows, по умолчанию, путь System32, возвращаемый этой константой указывает к папке, содержащий 32-разрядные системные файлы, точно так же как в 32-разрядном Windows. (Константа может быть переопределена включением 64-разрядного режима.)

{syswow64}
На 64-разрядном Windows системная папка SysWOW64, обычно "C:\WINDOWS\SysWOW64". Это каталог, в котором находятся 32-разрядные системные файлы.

Не используйте эту константу, если нет необходимости получить имя каталога, в котором находятся 32-разрядные системные файлы. Многократное использование {syswow64} в местах, где {sys} будет достаточен, может вызвать проблемы. (Для примера см. документацию флага sharedfile секции [Files].)

{src}
Папка, в которой находится инсталлятор.
Например: ввели {src}\MYPROG.EXE, инсталлятор запущен из "S:\", на выходе "S:\MYPROG.EXE".

{sd}
Системный диск, на котором установлен Windows. Обычно это "C:". Эта константа эквивалентна переменной среды SystemDrive.

{pf}
Путь к папке Program Files. {pf} эквивалентна {pf32}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {pf64}.

{pf32}
Путь к 32-разрядной системной папке Program Files, обычно "C:\Program Files" в 32-разрядном Windows и "C:\Program Files (x86)" в 64-разрядном Windows.

{pf64}
Только для 64-разрядного Windows: 64-разрядные программные файлы. Путь к 64-разрядной системной папке Program Files, обычно "C:\Program Files". Будет исключение, если предпринять попытку использования этой константы в 32-разрядном Windows.

{cf}
Общие файлы - Common Files. {cf} эквивалентна {cf32}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {cf64}.

{cf32}
32-разрядные общие файлы. Путь к 32-разрядной системной папке Common Files, обычно "C:\Program Files\Common Files" в 32-разрядном Windows и "C:\Program Files (x86)\Common Files" в 64-разрядном Windows.

{cf64}
Только для 64-разрядного Windows: 64-разрядные общие файлы. Путь к 64-разрядной системной папке Common Files, обычно "C:\Program Files\Common Files". Будет исключение, если предпринять попытку использования этой константы в 32-разрядном Windows.

{tmp}
Временная папка. Это не значение переменной среды TEMP пользователя. Это папка, где создаются временные файлы инсталлятора ("C:\WINDOWS\TEMP\IS-xxxxx.tmp"). Все файлы и папки удаляются из папки Temp после завершения установки приложения. Эта константа используется в случае, если в секции [Run] указаны файлы, необходимые при инсталляции, но не нужные для дальнейшей работы приложения.

{fonts}
Папка шрифтов. Обычно именуется FONTS и находится в папке Windows.

{dao}
Папка DAO. Эквивалентна {cf}\Microsoft Shared\DAO.

{dotnet11}
32-разрядная корневая папка .NET Framework версии 1.1.

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

{dotnet20}
Корневая папка .NET Framework версии 2. {dotnet20} эквивалентна {dotnet2032}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {dotnet2064}.

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

{dotnet2032}
32-разрядная корневая папка .NET Framework версии 2.

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

{dotnet2064}
Только для 64-разрядного Windows: 64-разрядная корневая папка .NET Framework версии 2.

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

{dotnet40}
Корневая папка .NET Framework версии 4. {dotnet40} эквивалентна {dotnet4032}, если инсталлятор не работает в 64-разрядном режиме, иначе эквивалентна {dotnet4064}.

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

{dotnet4032}
32-разрядная корневая папка .NET Framework версии 4.

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

{dotne4064}
Только для 64-разрядного Windows: 64-разрядная корневая папка .NET Framework версии 4.

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

Константы специальных папок
В Inno Setup используются и другие константы, именуемые константами специальных папок. Используются они так же, как и константы папок.

Константы "common" являются общими для всех профилей пользователей.

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

Как уже говорилось, константы специальных папок применимы ко всем версиям Windows, поддерживающих Inno Setup.

* = константа "common" равна константе "user", если пользователь, устанавливающий приложение, является администратором или PrivilegesRequired=lowest.

{group}
Путь к группе меню Пуск, который пользователь может изменить на странице Выберите папку в меню «Пуск». Эта папка всегда создается для всех профилей пользователей, если только пользователь, устанавливающий приложение, не имеет прав администратора, иначе путь задается только для профиля текущего пользователя.

{localappdata}
Путь к локальной папке приложения (не Roaming).

{sendto}
Путь к папке Send To пользователя (общей Send To папки нет).

{userappdata} & {commonappdata}
Путь к папке с данными приложения (Application Data).

{usercf}
Путь к папке Common Files текущего пользователя. Константа поддерживается только в Windows 7 и более поздних версиях. При использовании в предыдущих версиях Windows значение константы будет заменено на {localappdata}\Programs\Common.

{userdesktop} & {commondesktop} *
Путь к папке рабочего стола.

{userdocs} & {commondocs}
Путь к папке Мои документы.

{userfavorites} & {commonfavorites} *
Путь к папке Избранное.

{userpf}
Путь к папке Program Files текущего пользователя. Константа поддерживается только в Windows 7 и более поздних версиях. При использовании в предыдущих версиях Windows значение константы будет заменено на {localappdata}\Programs.

{userprograms} & {commonprograms} *
Путь к папке Программы в меню Пуск.

{userstartmenu} & {commonstartmenu} *
Путь к "корню" меню Пуск.

{userstartup} & {commonstartup} *
Путь к папке Автозагрузка в меню Пуск.

{usertemplates} & {commontemplates} *
Путь к папке шаблонов.

Прочие константы
{\}
Обратный слеш. Прочитайте в начале этой страницы о правилах использования {\} и \.

{%NAME|DefaultValue}
Вставляет значение переменной среды.

•NAME - имя переменной среды
•DefaultValue - определяет текст, который будет вставлен в случае, если константа не существует
•Для вставки запятой, вертикальной черты ("|"), или закрывающей фигурной скобки ("}") запишите нужный символ в виде "%-код символа.". Замените символ символом "%" и его двухразрядным шестнадцатеричным кодом. Запятая - "%2c", вертикальная черта - "%7c", и закрывающая фигурная скобка - "%7d". Если Вы хотите включить символ "%", используйте "%25".
•NAME и DefaultValue могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{%COMSPEC}{%PROMPT|$P$G}

{cmd}
Полный путь к стандартному системному интерпретатору. Это обычно Windows\System32\cmd.exe. При этом переменная среды COMSPEC не используется.

{computername}
Имя компьютера, на котором запущен инсталлятор или деинсталлятор (результат функции GetComputerName).

{drive:Path}
Возвращает букву диска и двоеточие из указанного пути (например, "C:"). В случае установки через сеть возвращает имя сервера и имя общего документа (например, "\\SERVER\SHARE").

•Path - определяет путь.
•Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
•Path может содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Примеры:
{drive:{src}}{drive:c:\path\file}{drive:\\server\share\path\file}

{groupname}
Имя папки, которую пользователь выбрал на странице Выберите папку в меню «Пуск». В отличие от константы {group} эта константа равна имени папки «Пуск», а не полному пути к ней.

{hwnd}
(Специального назначения) Дескриптор фонового окна инсталлятора.

{wizardhwnd}
(Специального назначения) Дескриптор окна мастера инсталлятора. Равен '0', если на момент обращения окно не существует.

{ini:Filename,Section,Key|DefaultValue}
Берет значение из .INI файла.

•Filename - имя ini-файла, из которого производится чтение
•Section - имя секции
•Key - имя ключа
•DefaultValue - значение, возвращаемое, если параметр не существует
•Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
•Filename, Section, и Key могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{ini:{win}\MyProg.ini,Settings,Path|{pf}\My Program}
{language}
Встроенное имя выбранного языка. Для справки обратитесь к секции [Languages].

{cm:MessageName}
{cm:MessageName,Arguments}
Возвращает стандартное сообщение на заданном языке.

•MessageName - имя стандартного сообщения, из которого производится считывание. Для справки обратитесь к секции [CustomMessages] .
•Arguments - аргументы сообщения, разделенные запятыми
•Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
•Каждый аргумент в Arguments может содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{cm:LaunchProgram,Inno Setup}
Пример выдает "Launch Inno Setup", если выбран английский язык.

{reg:HKxx\SubkeyName,ValueName|DefaultValue}
Возвращает значение реестра.

•HKxx - определяет корневой ключ. Для справки обратитесь к секции [Registry]
•SubkeyName - имя раздела
•ValueName - имя параметра. Пустой параметр = "По умолчанию".
•DefaultValue - значение, возвращаемое, если параметр не существует или не строкового типа (REG_SZ или REG_EXPAND_SZ)
•Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
•SubkeyName, ValueName, и DefaultValue могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{reg:HKLM\Software\My Program,Path|{pf}\My Program}
{param:ParamName|DefaultValue}
Возвращает параметры командной строки.

•ParamName - имя параметра
•DefaultValue - значение, возвращаемое, если запрашиваемое значение не существует или не может быть определено.
•Для вставки запятой, "|", или "}" запишите нужный символ в виде"%-код символа.". Например, запятая - это "%2c", вертикальная черта - "%7c", "}" - "%7d". "%" = "%25".
•ParamName и DefaultValue могут содержать константы. Обратите внимание, что описанным выше способом закрывающая фигурная скобка задается только в случае, когда она используется сама по себе. Если же она обозначает константу, подобные изощрения не нужны.
Например:
{param:Path|{pf}\My Program}
Возвращает c:\My Program, если в командной строке введен /Path="c:\My Program".

{srcexe}
Полный путь инсталлятора, например "C:\SETUP.EXE".

{uninstallexe}
Полный путь деинсталлятора, например "C:\Program Files\My Program\unins000.exe". Эта константа чаще всего используется в секции [Icons] для задания иконки деинсталлятора. Действует только если директиве Uninstallable секции [Setup] присвоено значение yes (по умолчанию).

{sysuserinfoname}
{sysuserinfoorg}
Имя и организация, соответственно, к которым зарегистрирован Windows. Эта информация берется из реестра.

{userinfoname}
{userinfoorg}
{userinfoserial}
Имя, организация и серийный номер, которые пользователь указал на странице Информация о пользователе (эту страницу можно активировать директивой UserInfoPage). Обычно эти константы используются в секциях [INI] и [Registry], чтобы сохранить их значения для дальнейшего использования.

{username}
Имя пользователя, запустившего инсталлятор или деинсталлятор (результат функции GetUserName).

{log}
Имя файла системного журнала, или пустая строка, если журналирование не включено.

saurn 05-05-2013 20:38 2144956

insombia,
Код:

BorderStyle := bsDialog; //или
BorderIcons := [];


neorom 05-05-2013 20:58 2144978

Как мне изменить скрипт, чтоби чекбокс отображался на странице SelectComponentsPage а не SelectDirPage, все переделал, не помогло
читать дальше »
[_Code]
var
QuickLaunchIcon: TCheckBox;

function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon.Checked;
end;

procedure InitializeWizard();
begin
QuickLaunchIcon := TCheckBox.Create(WizardForm);
Parent := WizardForm.SelectDirPage;
Caption := 'Создать значок в Панели быстрого запуска';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 117;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := False;
end;
end;

saurn 05-05-2013 21:40 2145001

neorom,

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

[Code]
var
QuickLaunchIcon: TCheckBox;

function MakeQuickLaunchIcon: Boolean;
begin
Result := QuickLaunchIcon.Checked;
end;

procedure InitializeWizard();
begin
 
WizardForm.ComponentsDiskSpaceLabel.Hide;
  QuickLaunchIcon := TCheckBox.Create(WizardForm);
  with QuickLaunchIcon do
  begin
   
Parent := WizardForm.ComponentsDiskSpaceLabel.Parent;
    Caption := 'Создать значок в Панели быстрого запуска';
    SetBounds(WizardForm.ComponentsDiskSpaceLabel.Left, WizardForm.ComponentsDiskSpaceLabel.Top, WizardForm.ComponentsDiskSpaceLabel.Width, WizardForm.ComponentsDiskSpaceLabel.Height)
  end;
end;


neorom 05-05-2013 21:52 2145010

saurn Извините, но чекбокс не отображался на странице SelectComponentsPage.

saurn 05-05-2013 21:57 2145016

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

neorom 05-05-2013 22:24 2145031

Цитата:

Цитата saurn
добавьте в скрипт хотя бы один компонент, в секции [Components], чтобы создалась страница компонентов, тогда чекбокс увидите »

На странице я стараюсь сделать вывод чекбокса без секции [Components], эсть только секции [Files] та [Icon] с которих береться файли.

saurn 05-05-2013 22:29 2145040

neorom, если в скрипте не указан ни один компонент в секции [Components], страница компонентов создана не будет, так как надобность в ней отпадает, логично? Вы хотите разместить контрол на странице выбора компонентов, но при этом ваш установщик компонетов не содержит. Выход: размещайте контрол на другой странице.

neorom 05-05-2013 22:40 2145047

Цитата:

Цитата saurn
размещайте контрол на другой странице »

На какой странице именно ?

saurn 05-05-2013 22:44 2145050

neorom, на любой странице, которая есть в вашем установщике.
Код:

Parent := Страница мастера;

neorom 06-05-2013 09:07 2145152

Как создать пустую страницу, которая бы ишла после SelectDirPage, бо у меня ни как не получаэться.

vint56 06-05-2013 10:08 2145182

neorom,
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
MyPage: TWizardPage;

procedure InitializeWizard();
begin
MyPage := CreateCustomPage(wpSelectDir, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');
end;

insombia 06-05-2013 15:09 2145344

ребята,протестируйте инсталл,нету ли багов? http://rghost.ru/45801868

saurn 06-05-2013 17:10 2145407

insombia
читать дальше »
1. Со стартовой страницей надобы что-то сделать, текст сливается с картинкой и выглядит, как грязь.
2. При отмене инсталл аварийно завершает работу. Где-то косяк в скрипте.

insombia 06-05-2013 17:31 2145421

saurn нашел баг,это из-за скина,не хватало DeinitializeSetup в коде

neorom 07-05-2013 11:15 2145909

Может кто то поправить мой скрип, как при розположения родиобутона менялось фото (у верху бутон - одно фото, в низу - другоэ) фото с права от центра. Оба фота имеют одинакивиэ розмири
читать дальше »
[Setup]
AppName=IDM 6.15 Build 10 Final
AppVerName=Internet Download Manager
DefaultDirName={pf}\Internet Download Manager
DisableReadyPage=true
MergeDuplicateFiles=false
SolidCompression=false
Compression=lzma/ultra64
UseSetupLdr=true
AppID=Internet Download Manager
DefaultGroupName=Internet Download Manager
WizardImageFile=modern-wizard.bmp
WizardSmallImageFile=modern-header.bmp

[Languages]
Name: Ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl

[Files]
Source: 01.bmp; Flags: dontcopy solidbreak
Source: instaler\*.*; DestDir: {app}; Check: installer
Source: portable\*.*; DestDir: {app}; Check: portable

[_Code]
var
ISCustomPage1: TWizardPage;
BitmapImage1: TBitmapImage;
NewGroupBox1: TNewGroupBox;
NewRadioButton1: TNewRadioButton;
NewRadioButton2: TNewRadioButton;
NewGroupBox2: TNewGroupBox;
NewCheckBox1: TNewCheckBox;
NewCheckBox2: TNewCheckBox;
NewCheckBox3: TNewCheckBox;
NewCheckBox4: TNewCheckBox;

function installer: Boolean;
begin
Result := NewRadioButton1.Checked;
end;

function portable: Boolean;
begin
Result := NewRadioButton2.Checked;
end;

function Icons1: Boolean;
begin
Result:= NewCheckBox1.Checked;
end;

function Icons2: Boolean;
begin
Result:= NewCheckBox2.Checked;
end;

function Icons3: Boolean;
begin
Result:= NewCheckBox3.Checked;
end;

function Icons4: Boolean;
begin
Result:= NewCheckBox4.Checked;
end;

procedure NewRadioButton1Click(Sender: TObject);
begin
NewCheckBox1.Checked:= NewRadioButton1.Checked;
NewCheckBox2.Checked:= NewRadioButton1.Checked; //Подставляем значение
NewCheckBox3.Checked:= NewRadioButton1.Checked;
NewCheckBox4.Checked:= NewRadioButton1.Checked;
NewCheckBox1.Enabled:= NewRadioButton1.Checked;
NewCheckBox2.Enabled:= NewRadioButton1.Checked;
NewCheckBox3.Enabled:= NewRadioButton1.Checked;
NewCheckBox4.Enabled:= NewRadioButton1.Checked;
end;

procedure NewRadioButton2Click(Sender: TObject);
begin
NewCheckBox1.Enabled:= NewRadioButton1.Checked;
NewCheckBox2.Enabled:= NewRadioButton1.Checked;
NewCheckBox3.Enabled:= NewRadioButton1.Checked;
NewCheckBox4.Enabled:= NewRadioButton1.Checked;
NewCheckBox1.Checked:= NewRadioButton1.Checked;
NewCheckBox2.Checked:= NewRadioButton1.Checked;
NewCheckBox3.Checked:= NewRadioButton1.Checked;
NewCheckBox4.Checked:= NewRadioButton1.Checked;
end;

procedure NewCheckBox1Click(Sender: TObject); forward;
procedure NewCheckBox2Click(Sender: TObject); forward;
procedure NewCheckBox3Click(Sender: TObject); forward;
procedure NewCheckBox4Click(Sender: TObject); forward;
procedure PageNameLabelClick(Sender: TObject); forward;

procedure RedesignWizardForm;
begin
ISCustomPage1 := CreateCustomPage(wpSelectComponents, 'Вибір типа компонентів встановлення', ' ...');
with ISCustomPage1.Surface do
begin
Name := 'ISCustomPage1';
end;

BitmapImage1 := TBitmapImage.Create(WizardForm);
with BitmapImage1 do
begin
Name := 'BitmapImage1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(232);
Top := ScaleY(32);
Width := ScaleX(180);
Height := ScaleY(180);
ExtractTemporaryFile('01.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\01.bmp'));
end;

NewGroupBox1 := TNewGroupBox.Create(WizardForm);
with NewGroupBox1 do
begin
Name := 'NewGroupBox1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(8);
Top := ScaleY(8);
Width := ScaleX(209);
Height := ScaleY(65);
Caption := 'Мова інтерфейсу за умовчанням';
end;

NewRadioButton1 := TNewRadioButton.Create(WizardForm);
with NewRadioButton1 do
begin
Name := 'NewRadioButton1';
Parent := NewGroupBox1;
Left := ScaleX(8);
Top := ScaleY(16);
Width := ScaleX(196);
Height := ScaleY(17);
Checked := True;
Caption := 'Встановлення звичайної версії';
OnClick := @NewRadioButton1Click;
end;

NewRadioButton2 := TNewRadioButton.Create(WizardForm);
with NewRadioButton2 do
begin
Name := 'NewRadioButton2';
Parent := NewGroupBox1;
Left := ScaleX(8);
Top := ScaleY(40);
Width := ScaleX(196);
Height := ScaleY(17);
Caption := 'Розпакування портативної версії';
OnClick := @NewRadioButton2Click;
end;

NewRadioButton1.TabOrder := 0;
NewRadioButton2.TabOrder := 1;

NewGroupBox2 := TNewGroupBox.Create(WizardForm);
with NewGroupBox2 do
begin
Name := 'NewGroupBox2';
Parent := ISCustomPage1.Surface;
Left := ScaleX(8);
Top := ScaleY(112);
Width := ScaleX(209);
Height := ScaleY(113);
Caption := 'Додатково';
end;

NewCheckBox1 := TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Name := 'NewCheckBox1';
Parent := NewGroupBox2;
Left := ScaleX(8);
Top := ScaleY(16);
Width := ScaleX(196);
Height := ScaleY(17);
Checked := True
Caption := 'Закріпити в панелі задач';
OnClick := @NewCheckBox1Click;
end;

NewCheckBox2 := TNewCheckBox.Create(WizardForm);
with NewCheckBox2 do
begin
Name := 'NewCheckBox2';
Parent := NewGroupBox2;
Left := ScaleX(8);
Top := ScaleY(40);
Width := ScaleX(196);
Height := ScaleY(17);
Checked := True
Caption := 'Закріпити в меню ПУСК';
OnClick := @NewCheckBox2Click;
end;

NewCheckBox3 := TNewCheckBox.Create(WizardForm);
with NewCheckBox3 do
begin
Name := 'NewCheckBox3';
Parent := NewGroupBox2;
Left := ScaleX(8);
Top := ScaleY(64);
Width := ScaleX(196);
Height := ScaleY(17);
Checked := True
Caption := 'Ярлик(и) на робочому столі';
OnClick := @NewCheckBox3Click;
end;

NewCheckBox4 := TNewCheckBox.Create(WizardForm);
with NewCheckBox4 do
begin
Name := 'NewCheckBox4';
Parent := NewGroupBox2;
Left := ScaleX(8);
Top := ScaleY(88);
Width := ScaleX(196);
Height := ScaleY(17);
Checked := True
Caption := 'Ярлики в меню ПУСК';
OnClick := @NewCheckBox4Click;
end;

NewCheckBox1.TabOrder := 0;
NewCheckBox2.TabOrder := 1;
NewCheckBox3.TabOrder := 2;
NewCheckBox4.TabOrder := 3;

NewGroupBox1.TabOrder := 0;
NewGroupBox2.TabOrder := 1;

with WizardForm.WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Width := ScaleX(150);
end;

with WizardForm.PageDescriptionLabel do
begin
Left := ScaleX(200);
Top := ScaleY(27);
Width := ScaleX(293);
end;

with WizardForm.PageNameLabel do
begin
OnClick := @PageNameLabelClick;
Left := ScaleX(200);
Width := ScaleX(269);
end;
end;

procedure PageNameLabelClick(Sender: TObject);
begin

end;


procedure NewCheckBox1Click(Sender: TObject);
begin

end;

procedure NewCheckBox2Click(Sender: TObject);
begin

end;

procedure NewCheckBox3Click(Sender: TObject);
begin

end;

procedure NewCheckBox4Click(Sender: TObject);
begin

end;

procedure InitializeWizard();
begin
RedesignWizardForm;
end;


GolD18 07-05-2013 16:21 2146050

Добрый день. Воспользовался скриптом, взятым с этого сайта на свой шрифт в инсталляторе. Код вставил себе в скрипт, ошибок при компиляции нет, но в инсталле шрифт не изменился.

читать дальше »
#define Font "Rurintania.ttf"
#define FontName "Rurintania"

[Setup]
RawDataResource=font:{#Font}

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

function FindResource(hModule: THandle; lpName: String; lpType: Integer): THandle; external 'FindResource{#A}@kernel32.dll stdcall';
function LoadResource(hModule, hResInfo: THandle): THandle; external 'LoadResource@kernel32.dll stdcall';
function LockResource(hResData: THandle): Longint; external 'LockResource@kernel32.dll stdcall';
function SizeofResource(hModule, hResInfo: THandle): DWORD; external 'SizeofResource@kernel32.dll stdcall';
function AddFontMemResourceEx(pbFont: Longint; cbFont: DWORD; pdv: Longint; var pcFonts: DWORD): THandle; external 'AddFontMemResourceEx@gdi32.dll stdcall';
function RemoveFontMemResourceEx(fh: THandle): BOOL; external 'RemoveFontMemResourceEx@gdi32.dll stdcall';

const
RT_RCDATA = 10;

var
fh, hResInfo, hResAddr: THandle;
pcFonts, iResSize: DWORD;

procedure InitializeWizard();
begin
if not FontExists('{#FontName}') then
begin
hResInfo := FindResource(HInstance, '_IS_FONT', RT_RCDATA);
iResSize := SizeofResource(HInstance, hResInfo);
hResAddr := LockResource(LoadResource(HInstance, hResInfo));
pcFonts := 1;
fh := AddFontMemResourceEx(hResAddr, iResSize, 0, pcFonts);
end;
//отсюда начинаем указывать наш шрифт
WizardForm.Font.Name := '{#FontName}';
end;

procedure DeinitializeSetup();
begin
RemoveFontMemResourceEx(fh);
end;


Брал этот код.

El Sanchez 07-05-2013 17:38 2146085

Цитата:

Цитата GolD18
Код вставил себе в скрипт, ошибок при компиляции нет, но в инсталле шрифт не изменился. »

GolD18, теперь покажите код, который на самом деле в вашем скрипте.

GolD18 07-05-2013 19:07 2146120

El Sanchez, http://rghost.ru/45831009 Без файлов. Просто скрипт. Напишите, если нужны будут файлы. Спасибо за помощь.

neorom 07-05-2013 20:07 2146149

Цитата:

Цитата saurn
И объясните конкретней, что вам нужно, а то я не совсем понял. »

Нужно чтоби когда позначка RadioButton стоит уверху, било одне фото, когда позначка RadioButton стоит внезу - другоэ фото.
Примерно так чтоби било а эсть так
http://us.ua/1111239/

El Sanchez 07-05-2013 20:24 2146153

Цитата:

Цитата GolD18
#define Font "Agent Orange 2.ttf"
#define FontName "Agent Orange 2"

GolD18, имя файла шрифта может быть любым, тут ошибки нет, но само имя шрифта не должно меняться. Откройте шрифт (по умолчанию у шрифтов ассоциация со стандартным виндовым fontview) и в поле Имя шрифта увидите то, что нужно писать при объявлении константы FontName. У шрифта Agent Orange версии 2 имя без двойки.

saurn 07-05-2013 20:38 2146165

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

[Code]
var
 
ISCustomPage1: TWizardPage;
  BitmapImage1: TBitmapImage;
  NewGroupBox1: TNewGroupBox;
  NewRadioButton1: TNewRadioButton;
  NewRadioButton2: TNewRadioButton;
  NewGroupBox2: TNewGroupBox;
  NewCheckBox1: TNewCheckBox;
  NewCheckBox2: TNewCheckBox;
  NewCheckBox3: TNewCheckBox;
  NewCheckBox4: TNewCheckBox;
  ErrorCode: Integer;
 
function InitializeSetup(): Boolean;
begin
  if not
FileExists(ExpandConstant('{tmp}\01.bmp')) then ExtractTemporaryFile('01.bmp');
  if not FileExists(ExpandConstant('{tmp}\02.bmp')) then ExtractTemporaryFile('02.bmp');
  Result := True;
end;

function installer: Boolean;
begin
 
Result := NewRadioButton1.Checked;
end;

function portable: Boolean;
begin
 
Result := NewRadioButton2.Checked;
end;

function Icons1: Boolean;
begin
 
Result:= NewCheckBox1.Checked;
end;

function Icons2: Boolean;
begin
 
Result:= NewCheckBox2.Checked;
end;

function Icons3: Boolean;
begin
 
Result:= NewCheckBox3.Checked;
end;

function Icons4: Boolean;
begin
 
Result:= NewCheckBox4.Checked;
end;

procedure BevelLabelClick(Sender: TObject);
begin
 
ShellExec('open','http://toloka.hurtom.com','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure NewRadioButtonClick(Sender: TObject);
begin
  case
TNewRadioButton(Sender) of
   
NewRadioButton1:
    begin
     
NewCheckBox1.Checked:= NewRadioButton1.Checked;
      NewCheckBox2.Checked:= NewRadioButton1.Checked;
      NewCheckBox3.Checked:= NewRadioButton1.Checked;
      NewCheckBox4.Checked:= NewRadioButton1.Checked;
      NewCheckBox1.Enabled:= NewRadioButton1.Checked;
      NewCheckBox2.Enabled:= NewRadioButton1.Checked;
      NewCheckBox3.Enabled:= NewRadioButton1.Checked;
      NewCheckBox4.Enabled:= NewRadioButton1.Checked;
      BitmapImage1.Bitmap.LoadFromFile(ExpandConstant('{tmp}\01.bmp'));
    end;
    NewRadioButton2:
    begin
     
NewCheckBox1.Enabled:= NewRadioButton1.Checked;
      NewCheckBox2.Enabled:= NewRadioButton1.Checked;
      NewCheckBox3.Enabled:= NewRadioButton1.Checked;
      NewCheckBox4.Enabled:= NewRadioButton1.Checked;
      NewCheckBox1.Checked:= NewRadioButton1.Checked;
      NewCheckBox2.Checked:= NewRadioButton1.Checked;
      NewCheckBox3.Checked:= NewRadioButton1.Checked;
      NewCheckBox4.Checked:= NewRadioButton1.Checked;
      BitmapImage1.Bitmap.LoadFromFile(ExpandConstant('{tmp}\02.bmp'));
    end;
  end;
end;

procedure NewCheckBox1Click(Sender: TObject); forward;
procedure NewCheckBox2Click(Sender: TObject); forward;
procedure NewCheckBox3Click(Sender: TObject); forward;
procedure NewCheckBox4Click(Sender: TObject); forward;
procedure PageNameLabelClick(Sender: TObject); forward;

procedure RedesignWizardForm;
begin
 
ISCustomPage1 := CreateCustomPage(wpSelectComponents, 'Вибір типа компонентів встановлення', '  ...');
  with ISCustomPage1.Surface do
  begin
   
Name := 'ISCustomPage1';
  end;

  BitmapImage1 := TBitmapImage.Create(WizardForm);
  with BitmapImage1 do
  begin
   
Name := 'BitmapImage1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(232);
    Top := ScaleY(32);
    Width := ScaleX(180);
    Height := ScaleY(180);
  end;

  NewGroupBox1 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox1 do
  begin
   
Name := 'NewGroupBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(8);
    Top := ScaleY(8);
    Width := ScaleX(209);
    Height := ScaleY(65);
    Caption := 'Мова інтерфейсу за умовчанням';
  end;

  NewRadioButton1 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton1 do
  begin
   
Name := 'NewRadioButton1';
    Parent := NewGroupBox1;
    Left := ScaleX(8);
    Top := ScaleY(16);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True;
    Caption := 'Встановлення звичайної версії';
    OnClick := @NewRadioButtonClick;
  end;

  NewRadioButton2 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton2 do
  begin
   
Name := 'NewRadioButton2';
    Parent := NewGroupBox1;
    Left := ScaleX(8);
    Top := ScaleY(40);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Caption := 'Розпакування портативної версії';
    OnClick := @NewRadioButtonClick;
  end;

  NewGroupBox2 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox2 do
  begin
   
Name := 'NewGroupBox2';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(8);
    Top := ScaleY(112);
    Width := ScaleX(209);
    Height := ScaleY(113);
    Caption := 'Додатково';
  end;

  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
   
Name := 'NewCheckBox1';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(16);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Закріпити в панелі задач';
    OnClick := @NewCheckBox1Click;
  end;

  NewCheckBox2 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox2 do
  begin
   
Name := 'NewCheckBox2';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(40);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Закріпити в меню ПУСК';
    OnClick := @NewCheckBox2Click;
  end;

  NewCheckBox3 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox3 do
  begin
   
Name := 'NewCheckBox3';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(64);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Ярлик(и) на робочому столі';
    OnClick := @NewCheckBox3Click;
  end;

  NewCheckBox4 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox4 do
  begin
   
Name := 'NewCheckBox4';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(88);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Ярлики в меню ПУСК';
    OnClick := @NewCheckBox4Click;
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
   
Left := ScaleX(0);
    Width := ScaleX(150);
  end;

  with WizardForm.PageDescriptionLabel do
  begin
   
Left := ScaleX(200);
    Top := ScaleY(27);
    Width := ScaleX(293);
  end;

  with WizardForm.PageNameLabel do
  begin
   
OnClick := @PageNameLabelClick;
    Left := ScaleX(200);
    Width := ScaleX(269);
  end;
end;

procedure PageNameLabelClick(Sender: TObject);
begin

end
;


procedure NewCheckBox1Click(Sender: TObject);
begin

end
;

procedure NewCheckBox2Click(Sender: TObject);
begin

end
;

procedure NewCheckBox3Click(Sender: TObject);
begin

end
;

procedure NewCheckBox4Click(Sender: TObject);
begin

end
;

procedure InitializeWizard();
begin
 
RedesignWizardForm;
  with WizardForm do
  begin
    with
BeveledLabel do
    begin
     
OnClick:=@BevelLabelClick;
      Font.Color:=clBlue;
      Enabled:=True;
      Cursor:=crHand;
      Font.Style:= [fsBold]
    end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case
CurPageID of
   
ISCustomPage1.ID: if NewRadioButton1.Checked then BitmapImage1.Bitmap.LoadFromFile(ExpandConstant('{tmp}\01.bmp'));
  end;
end;


neorom 07-05-2013 20:52 2146178

saurn спасибо.

P.S. Мне писали чтоби я сматрел у сборнике вопросов и ответов FAQ Ru-Board.chm, и я нашол много скриптов коториэ не роботают так как написано в описаниэ. (Я использую две версии розширениє версии компилятора остальной версии (ANSI i UNICODE ))И один скриптов. (Скрипт єтот не меняєт цвет и не єсть текст подчеркнутим при навидения мишки на него). Описаниэ - Как на BeveledLabel "повесить" ссылку, чтобы текст по умолчанию не был подчеркнут, а при наведении на текст, он подчеркивался и конечно, хотелось бы, менять цвет шрифта!
читать дальше »
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Messages]
BeveledLabel= Copyright 2007 © Microsoft

[_Code]
procedure BevelLabelClick(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','http://www.innosetup.com','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
begin
with WizardForm do begin
with BeveledLabel do begin
OnClick:=@BevelLabelClick;
Font.Color:=clBlue;
Enabled:=True;
Cursor:=crHand;
end;
end;
end;

saurn 07-05-2013 21:23 2146194

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

[Setup]
AppName=IDM 6.15 Build 10 Final
AppVerName=Internet Download Manager
DefaultDirName={pf}\Internet Download Manager
DisableReadyPage=true
MergeDuplicateFiles=false
SolidCompression=false
Compression=lzma/ultra64
UseSetupLdr=true
AppID=Internet Download Manager
DefaultGroupName=Internet Download Manager
WizardImageFile=modern-wizard.bmp
WizardSmallImageFile=modern-header.bmp

[Languages]
Name: Ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl

[Files]
Source: 01.bmp; Flags: dontcopy solidbreak
Source: 02.bmp; Flags: dontcopy solidbreak
Source: instaler\*.*; DestDir: {app}; Check: installer
Source: portable\*.*; DestDir: {app}; Check: portable

[Code]
var
  ISCustomPage1: TWizardPage;
  BitmapImage1: TBitmapImage;
  NewGroupBox1: TNewGroupBox;
  NewRadioButton1: TNewRadioButton;
  NewRadioButton2: TNewRadioButton;
  NewGroupBox2: TNewGroupBox;
  NewCheckBox1: TNewCheckBox;
  NewCheckBox2: TNewCheckBox;
  NewCheckBox3: TNewCheckBox;
  NewCheckBox4: TNewCheckBox;
  MouseLabel,SiteLabel: TLabel;
  ErrorCode: Integer;

function InitializeSetup(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\01.bmp')) then ExtractTemporaryFile('01.bmp');
  if not FileExists(ExpandConstant('{tmp}\02.bmp')) then ExtractTemporaryFile('02.bmp');
  Result := True;
end;

function installer: Boolean;
begin
  Result := NewRadioButton1.Checked;
end;

function portable: Boolean;
begin
  Result := NewRadioButton2.Checked;
end;

function Icons1: Boolean;
begin
  Result:= NewCheckBox1.Checked;
end;

function Icons2: Boolean;
begin
  Result:= NewCheckBox2.Checked;
end;

function Icons3: Boolean;
begin
  Result:= NewCheckBox3.Checked;
end;

function Icons4: Boolean;
begin
  Result:= NewCheckBox4.Checked;
end;

procedure SiteLabelOnClick(Sender: TObject);
begin
  ShellExec('open','http://toloka.hurtom.com','', '', SW_SHOW, ewNoWait, ErrorCode);
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color := clRed;
  SiteLabel.Font.Style := [fsBold, fsUnderline];
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color := clBlue;
  SiteLabel.Font.Style := [fsBold, fsUnderline];
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color := clGreen;
  SiteLabel.Font.Style := [fsBold, fsUnderline];
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color := clBlue;
  SiteLabel.Font.Style := [fsBold];
end;

procedure NewRadioButtonClick(Sender: TObject);
begin
  case TNewRadioButton(Sender) of
    NewRadioButton1:
    begin
      NewCheckBox1.Checked:= NewRadioButton1.Checked;
      NewCheckBox2.Checked:= NewRadioButton1.Checked;
      NewCheckBox3.Checked:= NewRadioButton1.Checked;
      NewCheckBox4.Checked:= NewRadioButton1.Checked;
      NewCheckBox1.Enabled:= NewRadioButton1.Checked;
      NewCheckBox2.Enabled:= NewRadioButton1.Checked;
      NewCheckBox3.Enabled:= NewRadioButton1.Checked;
      NewCheckBox4.Enabled:= NewRadioButton1.Checked;
      BitmapImage1.Bitmap.LoadFromFile(ExpandConstant('{tmp}\01.bmp'));
    end;
    NewRadioButton2:
    begin
      NewCheckBox1.Enabled:= NewRadioButton1.Checked;
      NewCheckBox2.Enabled:= NewRadioButton1.Checked;
      NewCheckBox3.Enabled:= NewRadioButton1.Checked;
      NewCheckBox4.Enabled:= NewRadioButton1.Checked;
      NewCheckBox1.Checked:= NewRadioButton1.Checked;
      NewCheckBox2.Checked:= NewRadioButton1.Checked;
      NewCheckBox3.Checked:= NewRadioButton1.Checked;
      NewCheckBox4.Checked:= NewRadioButton1.Checked;
      BitmapImage1.Bitmap.LoadFromFile(ExpandConstant('{tmp}\02.bmp'));
    end;
  end;
end;

procedure NewCheckBox1Click(Sender: TObject); forward;
procedure NewCheckBox2Click(Sender: TObject); forward;
procedure NewCheckBox3Click(Sender: TObject); forward;
procedure NewCheckBox4Click(Sender: TObject); forward;
procedure PageNameLabelClick(Sender: TObject); forward;

procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpSelectComponents, 'Вибір типа компонентів встановлення', '  ...');
  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  BitmapImage1 := TBitmapImage.Create(WizardForm);
  with BitmapImage1 do
  begin
    Name := 'BitmapImage1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(232);
    Top := ScaleY(32);
    Width := ScaleX(180);
    Height := ScaleY(180);
  end;

  NewGroupBox1 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox1 do
  begin
    Name := 'NewGroupBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(8);
    Top := ScaleY(8);
    Width := ScaleX(209);
    Height := ScaleY(65);
    Caption := 'Мова інтерфейсу за умовчанням';
  end;

  NewRadioButton1 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton1 do
  begin
    Name := 'NewRadioButton1';
    Parent := NewGroupBox1;
    Left := ScaleX(8);
    Top := ScaleY(16);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True;
    Caption := 'Встановлення звичайної версії';
    OnClick := @NewRadioButtonClick;
  end;

  NewRadioButton2 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton2 do
  begin
    Name := 'NewRadioButton2';
    Parent := NewGroupBox1;
    Left := ScaleX(8);
    Top := ScaleY(40);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Caption := 'Розпакування портативної версії';
    OnClick := @NewRadioButtonClick;
  end;

  NewGroupBox2 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox2 do
  begin
    Name := 'NewGroupBox2';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(8);
    Top := ScaleY(112);
    Width := ScaleX(209);
    Height := ScaleY(113);
    Caption := 'Додатково';
  end;

  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
    Name := 'NewCheckBox1';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(16);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Закріпити в панелі задач';
    OnClick := @NewCheckBox1Click;
  end;

  NewCheckBox2 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox2 do
  begin
    Name := 'NewCheckBox2';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(40);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Закріпити в меню ПУСК';
    OnClick := @NewCheckBox2Click;
  end;

  NewCheckBox3 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox3 do
  begin
    Name := 'NewCheckBox3';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(64);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Ярлик(и) на робочому столі';
    OnClick := @NewCheckBox3Click;
  end;

  NewCheckBox4 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox4 do
  begin
    Name := 'NewCheckBox4';
    Parent := NewGroupBox2;
    Left := ScaleX(8);
    Top := ScaleY(88);
    Width := ScaleX(196);
    Height := ScaleY(17);
    Checked := True
    Caption := 'Ярлики в меню ПУСК';
    OnClick := @NewCheckBox4Click;
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
    Left := ScaleX(0);
    Width := ScaleX(150);
  end;

  with WizardForm.PageDescriptionLabel do
  begin
    Left := ScaleX(200);
    Top := ScaleY(27);
    Width := ScaleX(293);
  end;

  with WizardForm.PageNameLabel do
  begin
    OnClick := @PageNameLabelClick;
    Left := ScaleX(200);
    Width := ScaleX(269);
  end;

  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 := 'RePack by neorom';
  SiteLabel.Font.Style := [fsBold];
  SiteLabel.OnClick := @SiteLabelOnClick;
  SiteLabel.OnMouseDown := @SiteLabelMouseDown;
  SiteLabel.OnMouseUp := @SiteLabelMouseUp;
  SiteLabel.OnMouseMove := @SiteLabelMouseMove;
  SiteLabel.Parent := WizardForm
end;

procedure PageNameLabelClick(Sender: TObject);
begin

end;


procedure NewCheckBox1Click(Sender: TObject);
begin

end;

procedure NewCheckBox2Click(Sender: TObject);
begin

end;

procedure NewCheckBox3Click(Sender: TObject);
begin

end;

procedure NewCheckBox4Click(Sender: TObject);
begin

end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    ISCustomPage1.ID: if NewRadioButton1.Checked then BitmapImage1.Bitmap.LoadFromFile(ExpandConstant('{tmp}\01.bmp'));
  end;
end;


neorom 07-05-2013 21:39 2146207

Нет меня интересуєт именно тот скрипт из попереднього моєго сообшчения.
Сообшчения - P.S. Мне писали чтоби я сматрел у сборнике вопросов и ответов FAQ Ru-Board.chm, и я нашол много скриптов коториэ не роботают так как написано в описаниэ. (Я использую две версии розширениє версии компилятора остальной версии (ANSI i UNICODE ))И один скриптов. (Скрипт єтот не меняєт цвет и не єсть текст подчеркнутим при навидения мишки на него). Описаниэ - Как на BeveledLabel "повесить" ссылку, чтобы текст по умолчанию не был подчеркнут, а при наведении на текст, он подчеркивался и конечно, хотелось бы, менять цвет шрифта!
читать дальше »
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Messages]
BeveledLabel= Copyright 2007 © Microsoft

[_Code]
procedure BevelLabelClick(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','http://www.innosetup.com','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
begin
with WizardForm do begin
with BeveledLabel do begin
OnClick:=@BevelLabelClick;
Font.Color:=clBlue;
Enabled:=True;
Cursor:=crHand;
end;
end;
end;

saurn 07-05-2013 22:37 2146241

neorom, в этом примере нет ни строчки про изменение цвета и подчеркивание при наведении, потому и не работает. Обновил пример в предыдущем посте.

neorom 07-05-2013 22:51 2146256

Цитата:

Цитата saurn
в этом примере нет ни строчки про изменение цвета и подчеркивание при наведении, потому и не работает. »

Как нету, про изменение цвета и подчеркивание при наведении, смотри фото

saurn 07-05-2013 22:59 2146259

neorom, подчеркивание будет выглядеть так:
Код:

BeveledLabel.Font.Style := [fsUnderline]
Изменение текста(цвет, подчеркивание, стиль, шрифт и т.д.) в реальном времени, то есть при наведении курсора мыши осуществляется через Sender: TObject
Код:

procedure LabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  SiteLabel.Font.Color := clGreen; //изменение цвета
  SiteLabel.Font.Style := [fsBold, fsUnderline]; //изменение стиля
end;

...
OnMouseDown := @...;
OnMouseUp := @...;
OnMouseMove := @...;

Вы видите, что либо подобное в скрипте? Вот. Я знаю этот пример, и там только обработка клика на BeveledLabel. Мой пост с примером скрипта я обновил здесь. Там нужное вам подчеркивание и изменение цвета.

neorom 07-05-2013 23:23 2146270

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

saurn 07-05-2013 23:31 2146277

neorom, тот скрипт - это ваш скрипт, который был в архиве, с уже доведенными до ума короткими и длинными. Я просто объединил основной скрипт. Он готовый, берите и компилируйте. Хотите отдельно только кликабельный лейбл, могу дать отдельно, но будете объединять сами тогда.

neorom 07-05-2013 23:45 2146291

Цитата:

Цитата saurn
Хотите отдельно только кликабельный лейбл, могу дать отдельно, но будете объединять сами тогда. »

Да, я прашу просто до делать скрипт так как там написано.
читать дальше »
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Messages]
BeveledLabel= Copyright 2007 © Microsoft

[_Code]
procedure BevelLabelClick(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','http://www.innosetup.com','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
begin
with WizardForm do begin
with BeveledLabel do begin
OnClick:=@BevelLabelClick;
Font.Color:=clBlue;
Enabled:=True;
Cursor:=crHand;
end;
end;
end;

saurn 07-05-2013 23:59 2146303

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

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Messages]
BeveledLabel=RePack by neorom

[Code]
var
mLabel: TLabel;
ErrorCode: Integer;

procedure BevelLabelClick(Sender: TObject);
begin
  ShellExec('open', 'http://toloka.hurtom.com', '', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  WizardForm.BeveledLabel.Font.Color := clRed;
  WizardForm.BeveledLabel.Font.Style := [fsBold, fsUnderline];
end;

procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  WizardForm.BeveledLabel.Font.Color := clBlue;
  WizardForm.BeveledLabel.Font.Style := [fsBold, fsUnderline];
end;

procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  WizardForm.BeveledLabel.Font.Color := clGreen;
  WizardForm.BeveledLabel.Font.Style := [fsBold, fsUnderline];
end;

procedure lMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  WizardForm.BeveledLabel.Font.Color := clBlue;
  WizardForm.BeveledLabel.Font.Style := [fsBold];
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    mLabel := TLabel.Create(nil)
    mLabel.Width := WizardForm.Width;
    mLabel.Height := WizardForm.Height;
    mLabel.Autosize := False;
    mLabel.Transparent := True;
    mLabel.OnMouseMove := @lMouseMove;
    mLabel.Parent := WizardForm;
    with BeveledLabel do
    begin
      Font.Color := clBlue;
      Font.Style := [fsBold];
      Enabled := True;
      Cursor := crHand;
      OnClick := @BevelLabelClick;
      OnMouseDown := @MouseDown;
      OnMouseUp := @MouseUp;
      OnMouseMove := @MouseMove;
    end;
  end;
end;


alert30 08-05-2013 02:49 2146347

neorom, можете хоть правильно написать на русском языке?

GolD18 08-05-2013 04:34 2146356

El Sanchez, А в коде ошибок нету? Правильно я сделал? И то есть просто 2 убрать надо? Спасибо.
Меняю на другой, например на Comic Sans MS. Все равно не меняется.

GolD18 08-05-2013 07:18 2146379

saurn, Отправил вам в РМ.

neorom 08-05-2013 07:40 2146388

Цитата:

Цитата alert30
можете хоть правильно написать на русском языке? »

Извините, как могу, так и пишу(русский язык не мой родной).

41275jur 08-05-2013 16:31 2146621

Вложений: 1
Всем доброго времени суток!
Помогите со скриптом к программе DVD Rebuilder PRO 1.28.2
Сайт программы http://www.jdobbs.com/
Я хочу переписать скрипт, а именно убрать несколько языков, запуск установки кодека и запуск программы после установки и больше ничего изменять не надо. Скрипт должен максимально соответствовать оригиналу.
После распаковки инсталлятора попробовал собрать скр

Файл 98608

В секции [INI] начались первые проблемы. При сборке появилась ошибка



Убираю со скрипта запись Entry: QuEnc; - появляется вторая ошибка



Подскажите что это за переменные Entry: и Value: и чем их можно заменить.
Следующие ошибки в секции [Registry]
Код:

Root: HKLM; Subkey: "Software\DVD Rebuilder"; ValueName: "Working_Path"; ValueType: String; ValueData: "{code:settingsdir|workdir}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; Subkey: "Software\DVD Rebuilder"; ValueName: "Output_Path"; ValueType: String; ValueData: "{code:settingsdir|finishdir}"; Flags: uninsdeletevalue uninsdeletekeyifempty

Появляется ошибка



{code:settingsdir|workdir} - что оно обозначает. В реестре оригинальный инсталлятор прописывает ключ
Код:

[HKEY_LOCAL_MACHINE\SOFTWARE\DVD Rebuilder]
"Working_Path"="D:\\"
"Output_Path"="D:\\"

После распаковки есть две папки, в которых находятся файлы info.txt. При сборке выскакивает ошибка аналогичная ошибке в секции [Registry]
Код:

Source: "{code_settingsdir_workdir}\info.txt"; DestDir: "{code:settingsdir|workdir}"; Flags: uninsneveruninstall
Source: "{code_settingsdir_finishdir}\info.txt"; DestDir: "{code:settingsdir|finishdir}"; Flags: uninsneveruninstall


Mailchik 08-05-2013 17:20 2146641

Цитата:

Цитата 41275jur
Убираю со скрипта запись Entry: QuEnc; - появляется вторая ошибка »

Потому, что в Инно нет Entry и Value для секции INI. Вместо них Key и String соответственно.
Цитата:

Цитата 41275jur
Следующие ошибки в секции [Registry] »

Компилятор сообщает вам, что не может найти функцию settingsdir, которую вы использовали для ValueData. Если вам нужна папка, выбранная пользователем хватит константы {app}.
Цитата:

Цитата 41275jur
После распаковки есть две папки, в которых находятся файлы info.txt. При сборке выскакивает ошибка аналогичная ошибке в секции [Registry] »

То же самое.

El Sanchez 08-05-2013 20:43 2146740

Цитата:

Цитата GolD18
Меняю на другой, например на Comic Sans MS. Все равно не меняется. »

GolD18, у вас в том куске кода, что вы выложили, стандартные элементы управления скрыты, вместо них созданы свои с принудительным заданием шрифта Tahoma. Скрипт из шапки вы скопировали верно, даже пример использования применили (WizardForm.Font.Name := '{#FontName}';), значит, как максимум, при скрытом OuterNotebook от станлартных элементов должны остаться только кнопки Back, Next, Cancel с измененным шрифтом, но вы не видите, т.к. и кнопки вы оттекстуриваете botva2.dll. Что библиотека делает со шрифтом и откуда берет при отрисовке кнопки мне неизвестно. Для начала замените все Font.Name:='Tahoma'; на Font.Name:='{#FontName}';

41275jur 08-05-2013 21:07 2146747

Спасибо за разъяснение и помощь
Цитата:

Цитата Mailchik
Компилятор сообщает вам, что не может найти функцию settingsdir, которую вы использовали для ValueData. Если вам нужна папка, выбранная пользователем хватит константы {app}. »

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

Инсталлятор упаковал, но окна такого нет.
Подскажи пожалуйста где можно про это прочитать.
И про второе окно
Оригинал

Мой

saurn 08-05-2013 22:26 2146809

El Sanchez, вертел я его скрипт по всякому, Font.Name:='{#FontName}', ничего не меняет, шрифт удалось изменить только на кнопках. Возможно, я что-то не понял.
---------------------------------
41275jur, страничка с двумя эдитами - кастомная страница, создавать нужно в секции [code], в шапке есть пример по созданию кастомного диалогового окна. По странице с компонентами: чтобы отображался список компонентов, а не просто выбор типов установки, добавьте в [Types] флаг ; Flags: iscustom Например:
Код:

[Types]
Name: "custom"; Description: "{cm:custominstall}"; Flags: iscustom


insombia 08-05-2013 22:52 2146822

GolD18 а так пойдет?
читать дальше »
#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';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('{#Font}');
IsCustomFontInstalled:=AddFontResource(ExpandConst ant('{tmp}')+'\{#Font}')>0;
if IsCustomFontInstalled then SendMessage(HWND_BROADCAST,$1D,0,0);
if FontExists('{#FontName}') then FontName:='{#FontName}' else FontName:='Arial';
Result:= True;
end;

Procedure InitializeWizard();
begin
WizardForm.Font.Name:= FontName;
end;

procedure DeInitializeSetup();
begin
WizardForm.Free;
if IsCustomFontInstalled then
if RemoveFontResource(PAnsiChar(ExpandConstant('{tmp}')+'\{#Font}')) then SendMessage(HWND_BROADCAST,$1D,0,0);
end;

vint56 08-05-2013 23:02 2146828

41275jur
читать дальше »
[Types]
Name: "full"; Description: "Full installation (Recomended)";
Name: "update"; Description: "Update";
Name: "compact"; Description: "Compact installation";
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "rebuilder"; Description: "Program Files"; Types: "full compact custom update"; Flags: fixed
Name: "rebuilder"; Description: "Info File"; Types: "full compact custom update"; Flags: fixed
Name: "conf"; Description: "Automatic configuration"; Types: "full";
Name: "conf\config"; Description: "Preconfigured Rebuilder.ini (QuEnc/Three Click mode)"; Types: "compact full";
Name: "conf\paths"; Description: "CCE/ProCoder - Definition (ONLY IF YOU HAVE ONE OF THEM!!!)"; Types: "full custom compact";
Name: "conf\dgdecode"; Description: "Decoder 1.4.5"; Types: "full custom compact"; Flags: fixed
Name: "help"; Description: "Help Files"; Types: "custom compact update full";
Name: "filters"; Description: "Filters"; Types: "full";
Name: "filters\decomb"; Description: "Decomb.dll"; Types: "full";
Name: "filters\nicaudio"; Description: "nicaudio.dll"; Types: "full";
Name: "filters\undot"; Description: "UnDot 0.0.1.1"; Types: "full";
Name: "filters\deen"; Description: "Deen 1.0 beta 1"; Types: "full";
Name: "encoders"; Description: "Encoders"; Types: "full";
Name: "encoders\eclpro"; Description: "EclPro v1.11 (needed for Canopus ProCoder)"; Types: "full update";
Name: "encoders\quenc"; Description: "QuEnc 0.72beta"; Types: "full";
Name: "encoders\hc"; Description: "HC beta 0.23"; Types: "full";
Name: "encoders\ffmpeg"; Description: "FFMPEG v51.9.0"; Types: "full";
Name: "encoders\cmdline"; Description: "CMDLINE"; Types: "full";
Name: "encoders\rejig"; Description: "ReJig v0.5f (Transcoder)"; Types: "full";

habib2302 08-05-2013 23:56 2146854

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

saurn 09-05-2013 00:46 2146893

habib2302,
Указываете в качестве DefaultDirName ключ реестра, содержащий информацию о рабочей папки программы.
Код:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\My Program}

vint56 09-05-2013 08:05 2146970

habib2302,
читать дальше »
Вариант1
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={code:GetInstallDir}
AppendDefaultDirName=no

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

[code]
Function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Rockstar Games\EFLC', 'InstallPath', Path);//Какой ключ реестра ищет ...
Result := Path;
end;

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Rockstar Games\EFLC') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! Укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;

Вариант 2:
[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;
end;
end;
end;

Gnom_aka_Lexander 09-05-2013 10:04 2147008

vint56, более корректно все-таки, это делать по AppID.да и гемора гораздо меньше. Меньше кода - меньше ошибок и глюков. Да и подавляющее большинство пачей, дополнений и тому подобной дряни - ищут программу именно по AppID в разделе Uninstall.

41275jur 09-05-2013 12:16 2147075

Спасибо всем за помощь.
Цитата:

Цитата saurn
страничка с двумя эдитами - кастомная страница, создавать нужно в секции [code] »

Это мой первый скрипт и секция [code] для меня пока сильно сложная. Буду пробовать ваять.
Пока у меня получилось только это

[code]
Код:

var
  DataDirPage: TInputDirWizardPage;
 
procedure InitializeWizard;
begin
  { Create the pages }
 
  DataDirPage := CreateInputDirPage(wpSelectDir,
    'Параметры по умолчанию', 'Установка папки по умолчанию',
    'Чтобы продолжить, нажмите кнопку Далее. Если вы хотите выбрать различные папки, нажмите кнопку Обзор',
    False, 'D:\');
  DataDirPage.Add('');

  { Set default values, using settings that were stored last time if possible }

  DataDirPage.Values[0] := GetPreviousData('DataDir', '');
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
var
  UsageMode: String;
begin
  { Store the settings so we can restore them next time }
  SetPreviousData(PreviousDataKey, 'UsageMode', UsageMode);
  SetPreviousData(PreviousDataKey, 'DataDir', DataDirPage.Values[0]);
end;

И то папка по умолчанию не ставится и не знаю как добавить ниже текст и эдитам.

Подскажите еще где нужно исправить в скрипте, что бы программа перед установкой определяла установлена ли программа (AviSynth) или нет. Если не установлена, то запускала установку.

41275jur 09-05-2013 13:33 2147116

Подскажите как сделать эти два файла скрытыми
Код:

[Files]
Source: {app}\Dvd_icon.ICO; DestDir: {app}; Flags: ignoreversion
Source: {app}\Dvd_uninstall.ico; DestDir: {app}; Flags: ignoreversion


Gnom_aka_Lexander 09-05-2013 13:46 2147124

41275jur, hidden добавить во флаги. в справке-же есть.

saurn 09-05-2013 13:49 2147125

Цитата:

Цитата 41275jur
И то папка по умолчанию не ставится и не знаю как добавить ниже текст и эдитам.
Подскажите еще где нужно исправить в скрипте, что бы программа перед установкой определяла установлена ли программа (AviSynth) или нет. Если не установлена, то запускала установку. »

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

[Code]
var
 
DataDirPage: TInputDirWizardPage;

function InitializeSetup(): Boolean;
begin
  if
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
  begin
   
MsgBoxEx(0, 'Данная программа уже установленна', '', MB_OK, 0, 0)
    Result := False
  end else
   
Result := True;
end;

procedure InitializeWizard;
begin
 
DataDirPage := CreateInputDirPage(wpSelectDir, 'Параметры по умолчанию', 'Установка папки по умолчанию', 'Чтобы продолжить, нажмите кнопку Далее. Если вы хотите выбрать различные папки, нажмите кнопку Обзор', False, '');
  DataDirPage.Add('');
  DataDirPage.Add('');

  DataDirPage.Values[0] := 'D:\';
  DataDirPage.Values[1] := 'D:\';
end;


Цитата:

Цитата 41275jur
Подскажите как сделать эти два файла скрытыми »

Код:

[Files]
Source: {app}\Dvd_icon.ICO; DestDir: {app}; Flags: ignoreversion; attribs: hidden;
Source: {app}\Dvd_uninstall.ico; DestDir: {app}; Flags: ignoreversion; attribs: hidden;

Советую прикрутить сюда код для автоопределения диска установки из шапки http://forum.oszone.net/post-1217528-97.html , мало ли, вдруг у конечного пользователя не будет диска D

El Sanchez 09-05-2013 14:05 2147131

Цитата:

Цитата 41275jur
{code:settingsdir|workdir} - что оно обозначает »

41275jur, означает, что строковая константа есть результат функции settingsdir(param: String): String со значением переданного в нее строкового параметра, равным 'workdir', и описанной в секции Code. Подробнее: Inno Setup Help - Pascal Scripting - Scripted Constants.

Цитата:

Цитата 41275jur
В реестре оригинальный инсталлятор прописывает ключ
Код:
[HKEY_LOCAL_MACHINE\SOFTWARE\DVD Rebuilder]
"Working_Path"="D:\\"
"Output_Path"="D:\\" »

Цитата:

Цитата 41275jur
SetPreviousData(PreviousDataKey, 'UsageMode', UsageMode);
SetPreviousData(PreviousDataKey, 'DataDir', DataDirPage.Values[0]); »

Оригинальный инсталлятор читает эти пути из своего раздела реестра, необходимости в SetPreviousData нет, значение по умолчанию (D:\) не должно быть жестко заданным, у пользователя может оказаться только один логический диск. Можно взять первый логический диск после системного, а при отсутствии других дисков кроме системного брать сам системный. По крайней мере так я и реализовал.

Цитата:

Цитата 41275jur
что бы программа перед установкой определяла установлена ли программа (AviSynth) или нет. Если не установлена, то запускала установку. »

41275jur, оригинал лезет в реестр в раздел деинсталлятора AviSynth и проверяет на пустое значение параметр DisplayName. Такой подход провалится, если программы на компе уже нет, а реестровые хвосты остались, поэтому лучше находить в реестре параметр, содержащий путь, и по полученному пути определить жив ли какой-либо файл по этому пути. Такая двойная проверка увеличивает шансы корректного определения наличия программы. У Inno немного таких параметров с путями, первый - InstallLocation - выдаст программную папку приложения, в ней уже можно проверить наличие или отсутствие, скажем, главного исполняемого файла программы, второй - UninstallString - выдаст полный путь к файлу деинсталлятора. У AviSynth в наличии только параметр UninstallString, его-то и будем использовать.

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

Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"

const
   
MAX_PATH = 260;
    DRIVE_FIXED = 3;

function GetLogicalDriveStrings(nBufferLength: DWORD; var lpBuffer: Char): DWORD; external 'GetLogicalDriveStrings{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';

var
   
FoldersPage: TInputDirWizardPage;

//////////////////////////////////////////////////
function settingsdir(const param: String): String;
begin
    case
param of
       
'workdir': Result := FoldersPage.Values[0];
        'finishdir': Result := FoldersPage.Values[1];
    end;
end;

/////////////////////////////////////////////////////////////////
function GetFirstDriveAfterSystem(const Default: String): String;
var
   
i: Integer;
    buf: array [0..MAX_PATH-1] of Char;
begin
   
Result := Default;
    while i < GetLogicalDriveStrings(SizeOf(buf), buf[0])-3 do
    begin
       
Result := Format('%s:\', [buf[i]]);
        if (GetDriveType(Result) = DRIVE_FIXED) and (CompareText(Result, Default) <> 0) then Break;
        i := i + 4;
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
   
FoldersPage := CreateInputDirPage(wpSelectProgramGroup, CustomMessage('titleset'), CustomMessage('explset'), SetupMessage(msgSelectDirBrowseLabel), False, '');
    FoldersPage.Add(CustomMessage('WorkFolder'));
    FoldersPage.Add(CustomMessage('OutFolder'));
    FoldersPage.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\DVD Rebuilder,Working_Path|{code:GetFirstDriveAfterSystem|{sd}\}}');
    FoldersPage.Values[1] := ExpandConstant('{reg:HKLM\SOFTWARE\DVD Rebuilder,Output_Path|{code:GetFirstDriveAfterSystem|{sd}\}}');
end;

////////////////////////////////////
function InitializeSetup(): Boolean;
var
   
ResultCode: Integer;
begin
   
Result := FileExists(RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\AviSynth,UninstallString|}')));
    if not Result then
    begin
        if
MsgBox(ExpandConstant('{cm:noAviSynth1}{cm:noAviSynth2}{cm:noAviSynth3}{cm:noAviSynth4}'), mbError, MB_YESNO) = IDYES then
        begin
           
ExtractTemporaryFile('AviSynth_255.exe');
            Exec(ExpandConstant('{tmp}\AviSynth_255.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            Result := ResultCode = 0;
            if not Result then MsgBox(ExpandConstant('{cm:noAviSynth5}{cm:noAviSynth6}{cm:noAviSynth7}{cm:noAviSynth8}'), mbError, MB_OK);
        end;
    end;
end;


Johny777 09-05-2013 22:56 2147391

портировал с делфи интересную функцию ( GetEnvironmentVariable(...) ), кому надо забирайте:

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

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

//  Environment Variables:

//  ALLUSERSPROFILE
//  APPDATA
//  BDS
//  CLIENTNAME
//  CommonProgramFiles
//  COMPUTERNAME
//  ComSpec
//  Cor_Debugging_Control_424242
//  DBCONFIG
//  DBROOT
//  DBWORK
//  HOMEDRIVE
//  HOMEPATH
//  INCLUDE
//  LIB
//  LOGONSERVER
//  NUMBER_OF_PROCESSORS
//  OS_ROOTDIR
//  OS_TMPDIR
//  OS
//  Path
//  PATHEXT
//  PROCESSOR_ARCHITECTURE
//  PROCESSOR_IDENTIFIER
//  PROCESSOR_LEVEL
//  PROCESSOR_REVISION
//  ProgramFiles
//  SESSIONNAME
//  SystemDrive
//  SystemRoot
//  TEMP
//  TMP
//  USERDOMAIN
//  USERNAME
//  USERPROFILE
//  windir

function GetEnvironmentVariable(lpName, lpBuffer: String; nSize: DWORD): DWORD; external 'GetEnvironmentVariable{#A}@kernel32.dll stdcall';

function GetEnvVar(const VariableName: String): String;
var
   
Len: DWORD;
begin
   
Len := GetEnvironmentVariable(VariableName, '', 0);
    if Len > 0 then
    begin
       
SetLength(Result, Len);
        GetEnvironmentVariable(VariableName, Result, Len);
    end;
end;


procedure InitializeWizard();
begin
   
MsgBox(GetEnvVar('PROCESSOR_IDENTIFIER'), mbInformation, MB_OK);
end;


ABBAT 10-05-2013 07:47 2147457

Johny777, низкий поклон Вам за помощь с скриптами (удачи будте Счастливы )

evoll@vk 11-05-2013 00:14 2147849

помогите распотрошить и воссоздать полностью этот инсталлер как есть.
Код:

http://rghost.ru/45906542

audiofeel 11-05-2013 01:00 2147865

evoll@vk, да вроде ни че там такого нет (нужно что то конкретное узнать, )
там прекомп 038, унарк 2010 года, да рт консоль. Вам что нужно внешнее сходство без исдон или с исдон

evoll@vk 11-05-2013 08:40 2147907

Цитата:

Цитата audiofeel
evoll@vk, да вроде ни че там такого нет (нужно что то конкретное узнать, )
там прекомп 038, унарк 2010 года, да рт консоль. Вам что нужно внешнее сходство без исдон или с исдон »

у меня банально почему то не выходит правильно распаковать чтобы был правильный iss

insombia 11-05-2013 10:29 2147932

evoll@vk примерно так как тебе нужно,http://rghost.ru/45911273
добавишь isdone,примеры для текстурирования папок есть в закосе под механиков

saurn 12-05-2013 05:47 2148420

Всем привет. С прошедшими праздниками! В шапке есть пример http://forum.oszone.net/post-1444931-2009.html по закреплению ярлыка в панели задач семерки. Вопрос, как сделать так, чтобы процедура выполнения *.vbs пропускалась, если такой ярлык уже есть. Пробовал так:
читать дальше »
Код:

if not FileExists(AddBackslash(ExpandConstant('{userappdata}')) + AddBackslash('Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar') + '{#ApplicationName}.lnk') then
ShellExec('Open', AddBackslash(ExpandConstant('{tmp}')) + 'PinToTasckbar.vbs', '"""' + AddBackslash(ExpandConstant('{app}')) + 'Binaries\Win32\{#GameExe}' + '"""', ExpandConstant('{tmp}'), SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);


Не выходит. Выполняется в любом случае - есть ярлык или нет его.

habib2302 12-05-2013 17:45 2148700

saurn,
мне автор давал доработанный скрипт.держи
Код:

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExW@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadStringW@user32.dll stdcall';

// thank for code to "El Sanchez" from forum.oszone.net
procedure PinToTaskbar(Filename: String; IsPin: Boolean);
var
        hInst: THandle;
  buf: array [0..255] of char;
  i, Res: Integer;
  strVerb, sVBSFile: String;
  objShell, colVerbs, oFile: Variant;
begin
  if (GetWindowsVersion shr 24 < 6) or ((GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF < 1)) then Exit; // Windows 7 check

  if not FileExists(Filename) then Exit;
 
  if IsPin then Res := 5386 else Res := 5387;
  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;
      oFile    := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename));
      colVerbs := oFile.Verbs;
     
      if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), Filename) = 1) then begin
        sVBSFile := GenerateUniqueName (GetTempDir, 'mpc_be.vbs');
        SaveStringToFile (sVBSFile, \
          'Set oShell=CreateObject("Shell.Application")'  + #13 + \
          'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (Filename) + '").ParseName("' + ExtractFileName (Filename) + '").Verbs' + #13 + \
          'For Each oVerb In oVerbs'                                                                                        + #13 + \
          '  If (oVerb="' + strVerb + '") Then'                                                + #13 + \
          '    oVerb.DoIt'                                                                                                                    + #13 + \
          '    Exit For'                                                                                                                            + #13 + \
          '  End If'                                                                                                                                + #13 + \
          'Next'                                                                                                                                , False);
 
        exec( ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
        DeleteFile (sVBSFile);
      end else begin
        for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then begin
                            if (IsPin and oFile.IsLink) then
                                    DeleteFile (ExpandConstant ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName (Filename));
         
          colVerbs.Item[i].DoIt;
          Break;
        end;
      end;
    finally
      FreeDLL(hInst);
    end;
  end;
end;

а вот так юзать:
 при инсталле - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
 при удалениее - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), False);

только я не знаю как этот код присвоить к секции tasks т.е чтобы можно было выбрать создавать ярлык или нет.и незнаю куда этот код пихать
при инсталле - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
при удалениее - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), False);

и что нужно писать в секции icons
если этот скрипт будет работать,то скинь мне его

saurn 12-05-2013 18:13 2148710

Цитата:

Цитата habib2302
только я не знаю как этот код присвоить к секции tasks т.е чтобы можно было выбрать создавать ярлык или нет »

Код:

if IsTaskSelected('ляляля') then
PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);

Цитата:

Цитата habib2302
и незнаю куда этот код пихать »

По логике:
Код:

В CurStepChanged на шаге ssPostInstall - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
В CurUninstallStepChanged на шаге usUninstall - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), False);

В секции icons писать ничего не нужно, тут все делается через code. Спасибо. Попробую позже.

audiofeel 12-05-2013 18:23 2148715

evoll@vk,
Цитата:

Цитата evoll@vk
помогите распотрошить и воссоздать полностью этот инсталлер как есть. »

Смотрю я опаздал, но не выкидывать же, я сделал вместе с исдон - держите = http://rghost.ru/45948186

by_gangster 13-05-2013 09:40 2149138

Здравствуйте, возник вопрос по скрипту который качает файлы из интернета... Проблема в том что он после скачивания из временной папки (temp) должен перенести файл в указанную папку при инсталляции, но он этого не делает... В строке itd_addfile('http://sayt.ru/1.rar',expandconstant('{tmp}\1.rar')); tmp менял на src (т.е что бы файл лежал рядом с инсталлом) тогда он ложит файл рядом с инсталломЮ но опятть же его он не переносит в указанную папку...
Код:


[_Code]
procedure InitializeWizard();
begin
 itd_init;
 itd_addfile('http://sayt.ru/1.rar',expandconstant('{tmp}\1.rar'));


 //Start the download after the "Ready to install" screen is shown
 itd_downloadafter(wpReady);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
 if CurStep=ssInstall then begin //Lets install those files that were downloaded for us
  filecopy(expandconstant('{src}\1.rar'),expandconstant('{app}\1.rar'),false);

 end;
end;


saurn 13-05-2013 11:10 2149167

by_gangster, в скрипте не заметно строк связанных с переносом, только копирование.

Mailchik 13-05-2013 11:18 2149171

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

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

[Code]
#ifdef UNICODE
 type
  PChar = PAnsiChar;
#endif

const
 MOVEFILE_REPLACE_EXISTING = 1;

function MoveFileEx(lpExistingFileName, lpNewFileName: PChar; dwFlags: DWORD): BOOL;
 external 'MoveFileExA@kernel32.dll stdcall';

procedure CurPageChanged(CurPageID : integer);
 begin
  case CurPageID of
  wpSelectDir: begin
    MoveFileEx(ExpandConstant('{src}\test.iss'), ExpandConstant('{src}\test2.iss'),
    MOVEFILE_REPLACE_EXISTING);
  end;
  end;
end;


by_gangster 13-05-2013 11:23 2149173

Mailchik, И что это ?

saurn 13-05-2013 11:29 2149179

Цитата:

Цитата by_gangster
Mailchik, И что это ? »

Перемещение файлов это
Код:

[Code]
#ifdef UNICODE
 type
  PChar = PAnsiChar;
#endif

const
 MOVEFILE_REPLACE_EXISTING = 1;

function MoveFileEx(lpExistingFileName, lpNewFileName: PChar; dwFlags: DWORD): BOOL;
 external 'MoveFileExA@kernel32.dll stdcall';

procedure InitializeWizard();
begin
 itd_init;
 itd_addfile('http://sayt.ru/1.rar',expandconstant('{src}\1.rar'));
 itd_downloadafter(wpReady);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
 case CurStep of
  ssInstall: MoveFileEx(ExpandConstant('{src}\1.rar'), ExpandConstant('{app}\1.rar'), MOVEFILE_REPLACE_EXISTING);
 end;
end;


by_gangster 13-05-2013 11:48 2149196

saurn, не работает... он просто скачивает и ложит рядом с инсталлом

saurn 13-05-2013 11:57 2149203

by_gangster, скрипт можно полностью увидеть?

by_gangster 13-05-2013 13:55 2149270

saurn, Конечно !
Код:

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=example1
Compression=lzma
SolidCompression=true
CreateAppDir=true
ShowLanguageDialog=yes

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

#include ReadReg(HKEY_LOCAL_MACHINE,'Software\Sherlock Software\InnoTools\Downloader','ScriptPath','');

[_Code]
#ifdef UNICODE
 type
  PChar = PAnsiChar;
#endif

const
 MOVEFILE_REPLACE_EXISTING = 1;

function MoveFileEx(lpExistingFileName, lpNewFileName: PChar; dwFlags: DWORD): BOOL;
 external 'MoveFileExA@kernel32.dll stdcall';

procedure InitializeWizard();
begin
 itd_init;
 itd_addfile('http://sayt.ru/1.rar',expandconstant('{src}\1.rar'));
 itd_downloadafter(wpReady);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
 case CurStep of
  ssInstall: MoveFileEx(ExpandConstant('{src}\1.rar'), ExpandConstant('{app}\1.rar'), MOVEFILE_REPLACE_EXISTING);
 end;
end;


habib2302 13-05-2013 14:14 2149288

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

Johny777 13-05-2013 14:31 2149299

by_gangster, вот самодостаточный пример скачивания файла с последующим перемещением в нужную директорию
читать дальше »
Код:

//procedure MoveFile(const SourceFile, DestFile: String);
//var
//    oFS: Variant;
//begin
//    if not FileExists(SourceFile) then Exit;
//    if FileExists(DestFile) then Exit;
//    if not DirExists(ExtractFileDir(DestFile)) then
//      if not ForceDirectories(ExtractFileDir(DestFile)) then Exit;
//
//    oFS := CreateOleObject('Scripting.FileSystemObject');
//    try
//        oFS.MoveFile(SourceFile, DestFile);
//    except
//
//    end;
//end;

const
   
S_OK = $00000000;
    MOVEFILE_REPLACE_EXISTING = $00000001;

function URLDownloadToFile(Caller: IUnknown; URL, FileName: String; Reserved: DWORD; StatusCB: Longint): Longint; external 'URLDownloadToFileA@Urlmon.dll stdcall';
function MoveFileEx(lpExistingFileName, lpNewFileName: String; dwFlags: DWORD): BOOL; external 'MoveFileExA@kernel32.dll stdcall';
                                                                                                 
function DownloadFile(const SourceFile, DestFile: String): Boolean;
begin
    try
       
Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, 0) = S_OK;
    except
       
Result := False;
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    if
CurStep = ssInstall then
      if
DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.ee', 'C:\file.exe') then
        if not
MoveFileEx('C:\file.exe', 'C:\Test\file.exe', MOVEFILE_REPLACE_EXISTING) then
       
MsgBox('Ошибка перемещения файла:' + #13#10 + SysErrorMessage(DLLGetLastError), mbError, MB_OK); // Debug
end;



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

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

Цитата:

Цитата habib2302
дай лучше полный скрипт по закреплению ярлыка в панели задач семерки »

habib2302, в шапку посмотри, в соответствующий пример El Sanchez

saurn 13-05-2013 14:35 2149302

habib2302, я в своем скрипте сам разобратся не могу. Мой вопрос http://forum.oszone.net/post-2148420-416.html еще актуален))
Ну а по тому скрипту, вот:
читать дальше »
Код:

[Tasks]
Name: quicklaunchiconforseven; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; MinVersion: 0,6.1

[Code]
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExW@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadStringW@user32.dll stdcall';

// thank for code to "El Sanchez" from forum.oszone.net
procedure PinToTaskbar(Filename: String; IsPin: Boolean);
var
  hInst: THandle;
  buf: array [0..255] of char;
  i, Res: Integer;
  strVerb, sVBSFile: String;
  objShell, colVerbs, oFile: Variant;
begin
  if
(GetWindowsVersion shr 24 < 6) or ((GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF < 1)) then Exit; // Windows 7 check

 
if not FileExists(Filename) then Exit;

  if IsPin then Res := 5386 else Res := 5387;
  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;
      oFile    := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename));
      colVerbs := oFile.Verbs;

      if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), Filename) = 1) then begin
       
sVBSFile := GenerateUniqueName (GetTempDir, 'mpc_be.vbs');
        SaveStringToFile (sVBSFile, \
          'Set oShell=CreateObject("Shell.Application")'  + #13 + \
          'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (Filename) + '").ParseName("' + ExtractFileName (Filename) + '").Verbs' + #13 + \
          'For Each oVerb In oVerbs'                      + #13 + \
          '  If (oVerb="' + strVerb + '") Then'            + #13 + \
          '    oVerb.DoIt'                                + #13 + \
          '    Exit For'                                  + #13 + \
          '  End If'                                      + #13 + \
          'Next'                                , False);

        exec( ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
        DeleteFile (sVBSFile);
      end else begin
        for
i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then begin
          if (IsPin and oFile.IsLink) then
            DeleteFile (ExpandConstant ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName (Filename));

          colVerbs.Item[i].DoIt;
          Break;
        end;
      end;
    finally
     
FreeDLL(hInst);
    end;
  end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
CurStep of
   
ssPostInstall: if IsTaskSelected('quicklaunchiconforseven') then PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  case
CurUninstallStep of
   
usUninstall: PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), False);
  end;
end;


Хотя уважаемый Johny777 прав, в шапке есть.

by_gangster 13-05-2013 14:42 2149308

Johny777, Я так и пытался делать в строчке itd_addfile('http://sayt.ru/1.rar',expandconstant('{src}\1.rar')); src изменил на app, но выскакивает ошибка...

P.S есть ли скрипт который сразу в указанную папку скачает?

Johny777 13-05-2013 14:56 2149315

saurn,
Цитата:

Цитата saurn
Мой вопрос http://forum.oszone.net/post-2148420-416.html еще актуален)) »

из шапки взял, из той же функции закрепления ярлыка в панели задач:
читать дальше »
Код:

function ThereIsFile(const FileName: String): Boolean;
var
   
oFS: Variant;
begin
   
oFS := CreateOleObject('Scripting.FileSystemObject');
    try
       
Result := oFS.FileExists(FileName);
    except
       
//ShowExceptionMessage;
   
end;
end;

procedure InitializeWizard();
begin
    if
FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + 'Mozilla Firefox.lnk') then MsgBox('OK', mbInformation, MB_OK);
    //if ThereIsFile(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + 'Mozilla Firefox.lnk') then MsgBox('OK', mbInformation, MB_OK);
end;


PS: у тебя тоже вроде правильный путь был, но ни FileExists(...) ни альтернативная ThereIsFile(...)так не считали (аномалия ! ), но сейчас вроде работает :) и это главное!

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

by_gangster,
Цитата:

Цитата by_gangster
P.S есть ли скрипт который сразу в указанную папку скачает? »

в примере что я тебе дал
function DownloadFile(const SourceFile, DestFile: String): Boolean;

и в шапке ещё пример El Sanchez

saurn 13-05-2013 15:01 2149320

Johny777, дак по этому же принципу и проверял - ноль эмоций. Даже, если ярлык присутствует все равно вызов ShellExec проходит. В шапке еще есть второй пример закрепления ярлыка от El Sanchez, но у меня с ним траблы кое-какие(с скриптом не связаные) потому остановился на этом примере. Но, например, если запустить переустановку, то уже созданный ярлык удаляется.

Johny777 13-05-2013 15:09 2149326

saurn, насколько я помню код El Sanchez-а порт того самого VBS скрипта, какие траблы у тебя?
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;
первый входной параметр - путь к файлу, к которому нужно закрепить ярлык, второй - булев значение - закрепить/удалить ярлык

habib2302 13-05-2013 17:28 2149410

короче по поводу закрепления ярлыка в панели задач семерки задавайте вопросы автору Aleksoid1978
кстати.в inno setup есть скрипт
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[ 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';

//Filename: full path to executable file
//IsPin: False - unpin from TaskBar, True - pin to TaskBar
function PinToTaskbarWin7(Filename: String; IsPin: Boolean): Boolean;
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;

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

by_gangster 13-05-2013 18:16 2149424

Johny777, А в примере от El Sanchez, можно сделать что бы окно выбора не высвечивалось ?

habib2302 13-05-2013 20:13 2149476

люди.я незнаю как вам сказать.короче.как назначить иконку для ярлыка в этом скрипте Закрепить ярлык на панели задач в Windows 7 (вариант №1)

by_gangster 13-05-2013 20:17 2149477

habib2302, Я не совсем понял, если иконка инсталла то
Код:

[_setup]
IconFilename: "{app}\myicon.ico"


saurn 13-05-2013 20:46 2149486

Цитата:

Цитата habib2302
как назначить иконку для ярлыка в этом скрипте »

В качестве иконки ярлыка берется иконка исполняемого файла.

habib2302 13-05-2013 20:54 2149488

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

IconFilename: {app}\ico.ico;

by_gangster 13-05-2013 21:08 2149499

habib2302,
Цитата:

Цитата saurn
В качестве иконки ярлыка берется иконка исполняемого файла. »


El Sanchez 13-05-2013 21:23 2149509

Цитата:

Цитата by_gangster
А в примере от El Sanchez, можно сделать что бы окно выбора не высвечивалось ? »

by_gangster, замените эти строки:
Код:

if GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName)) then
try

вот этими:
Код:

if DirExists(szDestDir) then
try
   
fName := Format('%s\%s', [szDestDir, fName]);

Саму процедуру объявите как:
Код:

procedure DownloadFile(urlFilename, szDestDir: String);

P.S. Вообще-то пример в шапке устарел, заменю его как-нибудь.

Johny777 13-05-2013 21:32 2149513

by_gangster, El Sanchez,
позволил себе изменить немного процедуру скачивания:

procedure DownloadFile(интернет_ссылка_на_файл, имя_файла_сохранения, указатель_на_каллбэк_процедуру);
упростил немного код, благодаря каллбэку избавился от глобальных переменных и вынес конвертацию массива символов в строку в отдельную функцию и таким макаром избавился от некоторых действий
процедуры скачивания и теперь в функцию передаются не переменные, а const ссылки (так лучше)
пример скачивания и работы каллбэка ниже:


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

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

[code  ]

#ifdef UNICODE
    #define A "W"
    #define UCHAR "AnsiChar"
#else
    #define A "A"
    #define UCHAR "Char"
#endif

const
   
INTERNET_OPEN_TYPE_PRECONFIG = 0;
    INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
    INTERNET_FLAG_NEED_FILE = $10;
    INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
    HTTP_QUERY_LOCATION = 33;
    FILE_END = 2;
    INVALID_SET_FILE_POINTER = $FFFFFFFF;
   
    DOWNLOAD_START = -1;
    DOWNLOADING = 1;
    DOWNLOAD_END = 0;

type
   
_DOWNLOAD_CALLBACK = function(const StatusMessage, sFileNameAddr, dwFileSize, dwPosition: Longint): Boolean;
    HINTERNET = Longint;
   
var
   
StopDownload: Boolean;
    StopDownloadBtn: TButton;

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxy, lpszProxyBypass: String; dwFlags: DWORD): HINTERNET; external 'InternetOpen{#A}@wininet.dll stdcall';
function InternetOpenUrl(hInet: HINTERNET; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags, dwContext: DWORD): HINTERNET; external 'InternetOpenUrl{#A}@wininet.dll stdcall';
function InternetSetFilePointer(hFile: HINTERNET; lDistanceToMove, pReserved: Longint; dwMoveMethod, dwContext: DWORD): DWORD; external 'InternetSetFilePointer@wininet.dll stdcall';
function InternetReadFile(hFile: HINTERNET; var lpBuffer: {#UCHAR}; dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; external 'InternetReadFile@wininet.dll stdcall';
function InternetQueryDataAvailable(hFile: HINTERNET; var lpdwNumberOfBytesAvailable: DWORD; dwFlags, dwContext: DWORD): Boolean; external 'InternetQueryDataAvailable@wininet.dll stdcall';
function InternetCloseHandle(hInet: HINTERNET): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function DeleteUrlCacheEntry(lpszUrlName: String): BOOL; external 'DeleteUrlCacheEntryA@wininet.dll stdcall';
function HttpQueryInfo(hRequest: HINTERNET; dwInfoLevel: DWORD; var lpvBuffer: {#UCHAR}; var lpdwBufferLength, lpdwReserved: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: {#UCHAR}; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64{#A}@shlwapi.dll stdcall';
function StrFromTimeInterval(var pszOut: {#UCHAR}; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function GetTickCount(): DWORD; external 'GetTickCount@kernel32.dll stdcall';

////////////////////////////////////////////
function BytesToSize(Bytes: Extended): String;
var
   
pszBuf: array [0..15] of {#UCHAR};
begin
    try
       
Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;


function TicksToTime(Ticks: DWORD): String;
var
   
i: Byte;
    arr: array [0..31] of {#UCHAR};
begin
    for
i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;


function RoundDword(dwValue: DWORD): DWORD;
begin
   
dwValue := dwValue or (dwValue shr 1);
    dwValue := dwValue or (dwValue shr 2);
    dwValue := dwValue or (dwValue shr 4);
    dwValue := dwValue or (dwValue shr 8);
    dwValue := dwValue or (dwValue shr 16);
    Result := dwValue - (dwValue shr 1);
end;


procedure CancelDownloadOnClick(Sender: TObject);
begin
   
StopDownload := True;
end;

       
function DownloadProgress(const StatusMessage, sFileNameAddr, dwFileSize, dwPosition: Longint): Boolean;
begin
    case
StatusMessage of
       
DOWNLOAD_START:
        begin
           
WizardForm.ProgressGauge.Max := dwFileSize;
            StopDownloadBtn := TButton.Create(WizardForm)
            with StopDownloadBtn do
            begin
               
Parent := WizardForm;
                SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.Top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
                Caption := WizardForm.CancelButton.Caption;
                OnClick := @CancelDownloadOnClick;
            end;
            WizardForm.CancelButton.Hide;
        end;
        DOWNLOADING:
        begin
           
WizardForm.ProgressGauge.Position := dwPosition;
            WizardForm.StatusLabel.Caption := Format( 'FileName:' #32 '%s' #32 'FileSize:' #32 '%s', [CastIntegerToString(sFileNameAddr), BytesToSize(Extended(dwFileSize))] );
            WizardForm.FilenameLabel.Caption := Format( 'Downloaded:' #32 '%s' #32 'Ready:' #32 '%s', [BytesToSize(Extended(dwPosition)), FormatFloat('0.#0 %', (dwPosition*100)/dwFileSize)] );
            Application.ProcessMessages;
        end;
        DOWNLOAD_END:
        begin
           
WizardForm.CancelButton.Show;
            if StopDownloadBtn <> nil then StopDownloadBtn.Free;
        end;
    end;
  // Result := True;
   
Result := StopDownload;
end;


function CharArrayToString(const cArray: array of Char): String;
var
   
i: Integer;
begin
    for
i := 0 to GetArrayLength(cArray)-1 do Result := Result + cArray[i];
end;


procedure DownloadFile(const urlFilename, DestFileName: String; const CallBack: _DOWNLOAD_CALLBACK);
var
   
lpdwNumberOfBytesRead, lpdwNumberOfBytesAvailable, lpdwBufferLength, lpdwIndex: DWORD;
    hInt, hRedir, hFile: HINTERNET;
    dStop: Boolean;
    lpBuffer: array of {#UCHAR};
    fStream: TFileStream;
    fSize: DWORD;
begin
   
hInt := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
    if hInt <> 0 then
    try 
       
//Get file size
       
hRedir := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
        if hRedir <> 0 then
        try
           
SetArrayLength(lpBuffer, 1024);
            fSize := InternetSetFilePointer(hRedir, 0, 0, FILE_END, 0);
            if fSize = INVALID_SET_FILE_POINTER then
            begin
               
lpdwBufferLength := GetArrayLength(lpBuffer);
                lpdwIndex := 0;
                HttpQueryInfo(hRedir, HTTP_QUERY_LOCATION, lpBuffer[0], lpdwBufferLength, lpdwIndex);
                hFile := InternetOpenUrl(hInt, CharArrayToString(lpBuffer), '', 0, INTERNET_FLAG_NEED_FILE, 0);
                if hFile <> 0 then
                try
                   
fSize := InternetSetFilePointer(hFile, 0, 0, FILE_END, 0);
                finally
                   
InternetCloseHandle(hFile);
                    DeleteUrlCacheEntry(urlFilename);
                end;
            end;
        finally
           
InternetCloseHandle(hRedir);
            DeleteUrlCacheEntry(urlFilename);
        end;
        // download
       
       
if FileExists(DestFileName) then if not DeleteFile(DestFileName) then
        begin
           
InternetCloseHandle(hInt);
            Exit;
        end;
        if not DirExists(ExtractFileDir(DestFileName)) then if not ForceDirectories(ExtractFileDir(DestFileName)) then
        begin
           
InternetCloseHandle(hInt);
            Exit;
        end;
       
        hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
        if hFile <> 0 then
        try
           
fStream := TFileStream.Create(DestFileName, fmCreate);

            if CallBack <> nil then dStop := CallBack( DOWNLOAD_START, CastStringToInteger(DestFileName), Longint(fSize), 0);
            while (InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, 0, 0) and (lpdwNumberOfBytesAvailable > 0)) and not dStop do
            begin
               
SetArrayLength(lpBuffer, RoundDword(lpdwNumberOfBytesAvailable));
                InternetReadFile(hFile, lpBuffer[0], GetArrayLength(lpBuffer), lpdwNumberOfBytesRead);
                fStream.WriteBuffer(CharArrayToString(lpBuffer), lpdwNumberOfBytesRead);
                fStream.Seek(0, soFromEnd);
                if CallBack <> nil then dStop := CallBack(DOWNLOADING, CastStringToInteger(DestFileName), Longint(fSize), Longint(fStream.Size + lpdwNumberOfBytesRead));
            end;
        finally
           
fStream.Free;
            InternetCloseHandle(hFile);
            DeleteUrlCacheEntry(urlFilename);
            if CallBack <> nil then dStop := CallBack( DOWNLOAD_END, CastStringToInteger(DestFileName), Longint(fSize), 0);
            if dStop then DeleteFile(DestFileName);
        end;
    finally
       
InternetCloseHandle(hInt);
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    if
CurStep = ssInstall then DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe', ExpandConstant('{app}\File.exe'), @DownloadProgress); // ..., nil); - no Callback
end;



надеюсь не накосячил
и ещё есть поддержка юникодной инно и кнопка отмены

by_gangster 13-05-2013 21:40 2149526

Johny777, Ага только процедуру отмениь нельзя (кнопочкой) когда начинается скачивание...

Johny777, И ещё, почему нельзя так делать ?
begin
if CurStep = ssInstall then DownloadFile('http://sayt.ru/1.rar', '{app}\File.exe', @DownloadProgress); // ..., nil); - no Callback
end;

habib2302 13-05-2013 21:58 2149540

Цитата:

Цитата saurn
В качестве иконки ярлыка берется иконка исполняемого файла. »

может что-то можно дописать в vbs скрипт

Johny777 13-05-2013 23:32 2149608

by_gangster,
Цитата:

Цитата by_gangster
процедуру отмениь нельзя (кнопочкой) когда начинается скачивание »

добавил кнопку отменны, в перед. сообщении
Цитата:

Цитата by_gangster
И ещё, почему нельзя так делать ? »

И что это по твоему за путь '{app}\File.exe' ?
так нельзя, тк {app} - константа. Такую строку нужно пропускать через функцию ExpandConstant(...), которая заменяет константы на пути
короче нужно вот так DownloadFile('http://sayt.ru/1.rar', ExpandConstant('{app}\File.exe'), @DownloadProgress);

by_gangster 13-05-2013 23:52 2149618

Johny777, Выскакивает ошибка

Cannot create file D:\new\1.rar

Johny777 13-05-2013 23:56 2149621

by_gangster, без понятия, у меня всё в порядке. Посмотри в дебаггере на какой строке вылетает. К тому же что касается непосредственно скачивания я ничего не менял, так что ошибок быть не должно
предположу что файлстрим не может создать файл, тк он существует и его держит какой-то процесс
или папка "new" в пути "D:\new\1.rar" не существует (скорее всего именно из-за этого ошибка), исправил пост, пробуй

by_gangster 14-05-2013 10:39 2149762

Johny777, Сейчас всё нормально... но деинсталлятор не удаляет файл...

saurn 14-05-2013 12:25 2149855

Цитата:

Цитата by_gangster
Johny777, Сейчас всё нормально... но деинсталлятор не удаляет файл... »

Код:

[UninstallDelete]
Name: {app}\1.rar; Type: files

или
Код:

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


by_gangster 14-05-2013 14:13 2149943

saurn, Ну я и нуб, как я сразу не понял... :sorry:

by_gangster 14-05-2013 20:37 2150154

Может кому-нибудь пригодится полезный скрипт.

Перед запуском инсталлятор проверяет на наличие необходимой программы через реестр... В данном случае это игра S.T.A.L.K.E.R Зов Припяти
Код:

function InitializeSetup(): Boolean;
begin
 Result:=True;
 If (not RegKeyExists(HKLM, 'Software\GSC Game World\STALKER-COP')) then
 begin
  MsgBox('Не установлена игра S.T.A.L.K.E.R Зов Припяти', mbError, mb_Ok);
  Result:=False;
end;
end;


saurn 14-05-2013 20:47 2150160

by_gangster, можно эффективней, проверить наличие ветки реестра и одновременно наличие некоего файла в папке с игрой(в данном случае ексишника деинсталятора), на случай, если папку с игрой снесли, а хвосты в реестре остались:
Код:

function InitializeSetup(): Boolean;
begin
  Result := FileExists(RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\S.T.A.L.K.E.R._is1,UninstallString}')));
  if not Result then MsgBoxEx(0, 'Игра не установлена.', 'Игра не установленна', MB_OK or MB_ICONWARNING, 0, 0)
end;


by_gangster 14-05-2013 21:47 2150188

Скажите пожалуйста как в этом примере можно изменить шрифт ?

Mailchik 14-05-2013 22:04 2150194

by_gangster,
Код:

Font.Name := 'бла-бла-бла;
---------------------------------------------------------------------------------------------------------------------------------------
Цитата:

Цитата by_gangster
Может кому-нибудь пригодится полезный скрипт.
Перед запуском инсталлятор проверяет на наличие необходимой программы через реестр »

Если бы вы читали форумы по инно - здесь на oszone или на ру-борде, вы бы поняли, что эти строчки кода уже перепереезженные, и имеются во всех возможных FAQ'ах к инно. Но нет, вы умеете только орать, дайте мне то, дайте мне это....

by_gangster 14-05-2013 22:10 2150197

Цитата:

Цитата Mailchik
вы умеете только орать »

Кто орал то ?

saurn 16-05-2013 17:22 2151115

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

[Code]
function CheckedBoxes(const cNumber: Integer): Boolean;
begin
  case
cNumber of
   
1: Result := CheckBox_1.Checked;
    2: Result := CheckBox_2.Checked;
    3: Result := CheckBox_3.Checked;
    4: Result := CheckBox_4.Checked;
    5: Result := CheckBox_5.Checked;
    6: Result := CheckBox_6.Checked;
    7: Result := CheckBox_7.Checked;
    8: Result := CheckBox_8.Checked;
  end;
end;

//ну и проверка:

if CheckedBoxes(1) then
if
CheckedBoxes(2) then
if
CheckedBoxes(3) then
... и т.д.


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

Johny777 16-05-2013 18:21 2151151

saurn, Осваивай массивы (статичные и динамичные) и работу с ними, мелкий пример:

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


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

[code  ]
var
   
CheckArray: array of TCheckBox; // array [0..16] of TCheckBox;
   

function IndexOfCheckBox(const UCaption: String): Integer;
var
   
i: Integer;
begin
   
Result := -1;
    for i := GetArrayLength(CheckArray)-1 downto 0 do if CheckArray[i].Caption = UCaption then
    begin
       
Result := i;
        Break;
    end;
end;
   

function CaptionOfCheckBox(const UIndex: Integer): String;
var
   
i: Integer;
begin
    for
i := 0 to GetArrayLength(CheckArray)-1 do if i = UIndex then Result := CheckArray[i].Caption;
end;

function IsChecked(const UIndex: Integer): Boolean;
var
   
i: Integer;
begin
    if
UIndex > GetArrayLength(CheckArray)-1 then Exit;
    Result := CheckArray[UIndex].Checked;
end;


procedure InitializeWizard();
var
   
i: Integer;
begin
   
WizardForm.OuterNotebook.Hide;
   
    SetArrayLength(CheckArray, 16);
   
    CheckArray[0] := TCheckBox.Create(WizardForm)
    with CheckArray[0] do
    begin
       
Parent := WizardForm;
        Left := ScaleX(7);
        Top := ScaleY(7);
        Caption := IntToStr(0);
    end;
    for i := 1 to GetArrayLength(CheckArray)-1 do
    begin
       
CheckArray[i] := TCheckBox.Create(WizardForm)
        with CheckArray[i] do
        begin
           
Parent := WizardForm;
            Left := ScaleX(7);
            Top := ScaleY(CheckArray[i-1].Top + 16);
           
            if i mod 2 = 0 then Checked := True;
           
            Caption := IntToStr(i);
        end;
    end;
   
    ///
   
if IsChecked(10) then MsgBox('Checked', mbInformation, MB_OK);
    MsgBox(CaptionOfCheckBox(5), mbInformation, MB_OK);
    MsgBox(IntToStr( IndexOfCheckBox('7') ), mbInformation, MB_OK);
end;


Dinvin4ester 16-05-2013 23:44 2151304

Ребят , а что делать если ошибку выдает :( - http://i47.fastpic.ru/big/2013/0515/...2bfcb45e7a.png
Хочу подкоректировать этот скрипт - http://rghost.ru/46018269 - need-for-speedtm-hot-pursuit-1.5 (самый простой, так сказать для начинающих) :)
И да мне бы только код оформления выдернуть , а если нет подкорректировать - просто хочу инсталлы свои делать .Надеюсь на вашу помощь .

saurn 17-05-2013 12:03 2151485

Dinvin4ester, это ошибка ISDone. Означает, что не заданно ни одного архива *.arc для распаковки. Есть в скрипте секция, где задается, какой архив распаковывать, куда распаковывать, и местоположение архива соответственно.
Код:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.bin'), ExpandConstant('{app}'),  false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
Тут вам лучше почитать справку к ISDone, она есть в архиве со скриптом. Там все подробно расписанно. Если же нужно только оформление и сжатие внутренними средствами инно, и функции ISDone не нужны соответственно, могу убрать из скрипта ISDone.

Dinvin4ester 17-05-2013 13:15 2151509

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

saurn 17-05-2013 14:05 2151543

Dinvin4ester, убрал ISDone. Точнее отключил через препроцессор. Если понадобятся функции ISDone их можно включить, раскомментировав вот эту строку ;#define ISDone в шапке скрипта(убрав точку с запятой перед строкой)
Архив со скриптом на RGhost - Need For Speed Hot Porsuit
Что до лучшего сжатия: стороние архиваторы типа FreeArc, распаковка которых входит в число функций ISDone(кстати в этом скрипте полностью реализована распаковка архивов *.arc, нужно просто указать путь к своим архивам) вероятно дают лучшее сжатие при определенных условиях, но я использую только внутренние средства Inno, а потому ничего конкретного сказать не могу.

alert30 17-05-2013 16:07 2151609

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

Dinvin4ester 17-05-2013 19:35 2151722

saurn,
Огромное спасибо и еще нельзя ли эти системные требования - цвет что-ли изменить ?

saurn 17-05-2013 19:57 2151729

Dinvin4ester, можно. В шапке скрипта есть
Такие строчки
Код:

#ifdef Skin
; Цвет правой панели (значения), если используется скин
#define Color2  "clTeal"
#else
; Цвет правой панели (значения), если не используется скин
#define Color2  "$CCFFCC"
#endif
#ifdef Skin
; Цвет надписи "Все параметры Вашего компьютера соответсвуют требуемым.", если используется скин
#define Color3  "clLime"
#else
; Цвет надписи "Все параметры Вашего компьютера соответсвуют требуемым.", если не используется скин
#define Color3  "clGreen"
#endif
#ifdef Skin
; Цвет правой панели (значения), если значения не соответствуют требуемым и если используется скин
#define Color4  "$0101AF"
#else
; Цвет правой панели (значения), если значения не соответствуют требуемым и если не используется скин
#define Color4  "$CCCCFF"
#endif
#ifdef Skin
; Цвет надписи "Конфигурация Вашего компьютера не соответсвует тербуемой. Пожалуйста, проверьте компоненты, выделенные красным цветом.",
; если значения не соответствуют требуемым и если используется скин
#define Color5  "$1313FF"
#else
; Цвет надписи "Конфигурация Вашего компьютера не соответсвует тербуемой. Пожалуйста, проверьте компоненты, выделенные красным цветом.",
; если значения не соответствуют требуемым и если не используется скин
#define Color5  "clRed"
#endif


Именно они отвечают за изменение цвета панелей(левых\правых)системных параметров. Там подписано в комментариях, что к чему. Меняете на нужный вам цвет и все. Смотрите, пробуйте, подбирайте Таблица веб-цветов

Dinvin4ester 17-05-2013 20:15 2151736

saurn,
Ошибку выдает , связанную с HWREQ_Module.iss .

saurn 17-05-2013 20:25 2151747

Dinvin4ester, имеете, например, такой цветовой код 60 179 113.
В строке с указанием цвета, он будет выглядеть так:
Код:

#define Color1  "$60179113"

Принцип, думаю, понятен.

Dinvin4ester 17-05-2013 20:48 2151754

saurn,
Ок.. Ну я и дуб .Сорри , все получилось . Благодарю вас .
А с этим можно также - http://rghost.ru/46070070 ? Выбор таблетки и всякий хлам убрать если не сложно.

neorom 17-05-2013 21:59 2151785

У когось эсть пример как растятуть текст по вертикале и по горизонтале , и сжать текст по вертикале и по горизонтале. (Font.Size не придлагать.)
Фото

insombia 17-05-2013 22:42 2151796

neorom зачем этот гемор? такое подойдет?
http://i46.fastpic.ru/big/2013/0517/...705b6ecc3d.jpg

neorom 17-05-2013 22:46 2151798

Цитата:

Цитата insombia
зачем этот гемор? такое подойдет? »

Нет.

insombia 17-05-2013 22:57 2151806

neorom cкинь скрипт

neorom 17-05-2013 23:01 2151809

Это только часть скрипта отвичаючий за текст
читать дальше »
CaptionLabel1:= TLabel.Create(WizardForm);
CaptionLabel1.SetBounds(ScaleX(35), ScaleY(0), ScaleX(706), ScaleY(55));
CaptionLabel1.AutoSize:= False;
CaptionLabel1.WordWrap:= True;
CaptionLabel1.Transparent:= True;
CaptionLabel1.Font.Color:= $c5b89c
CaptionLabel1.Font.Size:= 12
CaptionLabel1.Font.Style:= [fsBold]
CaptionLabel1.Alignment:= taCenter;
CaptionLabel1.Parent:= WizardPanel;
CaptionLabel1.Font.Name:= 'Arial'

saurn 17-05-2013 23:05 2151813

Цитата:

Цитата neorom
(Font.Size не придлагать.) »

Могу предложить Font.Height := -19;
Узнаете другой способ изменения размера шрифта, меня тоже просветите)
Хотя... можно штамповать кучу лейблов - отдельный под каждую букву, и делать с ними, что угодно, в том числе и увеличивать расстановку букв, но как сказал товарищ insombia, этот геморр не стоит свеч.
Цитата:

Цитата Dinvin4ester
всякий хлам убрать если не сложно. »

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

Цитата:

Цитата Dinvin4ester
Выбор таблетки »

Это меняется через препроцессор в шапке скрипта.
читать дальше »
Код:

////////////Возможно выбрать только один из трех вариантов////////////////////
////////////(Var1) Вариант 1 - только выбор таблеток
////////////(Var2) Вариант 2 - только выбор доп компонентов
////////////(Var3) Вариант 3 - Выбор и доп компонентов и таблетки
#define Var1
;#define Var2
;#define Var3


insombia 17-05-2013 23:21 2151823

saurn согласен

neorom 18-05-2013 08:15 2151896

Цитата:

Цитата saurn
Могу предложить Font.Height := -19; »

Этот неподходит, жаль, спасибо и на этом.

Dinvin4ester 18-05-2013 15:11 2152056

saurn,
Оформление оставить , также как вы делали и раньше .Остальное не нужно)

Вот наподобии этой хочу сделать - http://s018.radikal.ru/i507/1211/4b/9c89be892801.jpg . Ранее то что вы мне сделали - Он кажется половину скрипта писал через IS GameScript Generator , а половину сторонее уже. Вот так как бы .Интересует то окно , маленькое .
Это было написано с помошью генератора , пропустил инсталлятор специально .
читать дальше »
[Setup]
SourceDir=.
OutputDir=Setup
AppName=Jumper Tree
AppVerName=Jumper Tree
AppVersion=Jumper Tree
DefaultDirName={pf}\Jumper Tree
DefaultGroupName=Jumper Tree
AllowNoIcons=yes
OutputBaseFilename=setup
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "C:\Users\Администратор\Desktop\Новая папка (11)\Files\Install\2.bmp"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Администратор\Desktop\Новая папка (5)\Files\Install\2.bmp"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Администратор\Desktop\Новая папка (5)\Files\Install\WizardImage.bmp"; 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: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Администратор\Desktop\KMC feat. Jamtech - Forever (Original Mix).mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Source: "E:\Приколы\Игры\Jumper Tree\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\Jumper Tree"; Filename: "{app}\JT.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\Jumper Tree"; Filename: "{app}\JT.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,Jumper Tree}"; Filename: "{uninstallexe}"

[Run]
Description: "{cm:LaunchProgram, Jumper Tree}"; Filename: "{app}\JT.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked

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

[code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;

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 ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
procedure ssAddImage(FileName:PChar); 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';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
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):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('KMC feat. Jamtech - Forever (Original Mix).mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\KMC feat. Jamtech - Forever (Original Mix).mp3');
CurrentMP3:=0;
Result:=True;
end;

procedure InitializeWizard;
begin
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ssInitialize(GetWindowLong(MainForm.Handle,-8),10,False,1,$FF000000);
ExtractTemporaryFile('2.bmp');
ssSetBkgImage(ExpandConstant('{tmp}')+'\2.bmp');
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('2.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\2.bmp');
ExtractTemporaryFile('WizardImage.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\WizardImage.bmp');
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
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
ssDeInitialize;
end;

+2 скрипт- как соединить их ?

Aquila 19-05-2013 02:39 2152335

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

by_gangster 19-05-2013 13:52 2152494

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

Gnom_aka_Lexander 19-05-2013 13:56 2152498

by_gangster, стандартные чекбоксы инно не меняют цвет шрифта и фона, хоть такие свойства у них и есть.

Crazy Noise 21-05-2013 01:18 2153279

Имеется ключ 1234-5678-ABCD-EFGH который просто записывается в файл keysgame.ini без каких либо секции и дополнительныч строк, просто ключ и всё. Сам keysgame.ini должен создаться при вставке ключа в папке Мои документы/GameEX.

Как это реализовать?

Есть только набросок кода
читать дальше »
Код:

[*code]
var
  CustomPage: TWizardPage;
  Edit1: TNewEdit;
  Edit2: TNewEdit;
  Edit3: TNewEdit;
  Edit4: TNewEdit;

procedure InitializeWizard();
begin
  CustomPage := CreateCustomPage(wpSelectTasks, 'Заголовок', 'Описание');

  Edit1 := TNewEdit.Create(WizardForm);
  with Edit1 do
  begin
    Parent := CustomPage.Surface;
    Left := ScaleX(96);
    Top := ScaleY(98);
    Width := ScaleX(50);
    Height := ScaleY(21);
  end;

  Edit2 := TNewEdit.Create(WizardForm);
  with Edit2 do
  begin
    Parent := CustomPage.Surface;
    Left := ScaleX(152);
    Top := ScaleY(98);
    Width := ScaleX(50);
    Height := ScaleY(21);
  end;

  Edit3 := TNewEdit.Create(WizardForm);
  with Edit3 do
  begin
    Parent := CustomPage.Surface;
    Left := ScaleX(208);
    Top := ScaleY(98);
    Width := ScaleX(50);
    Height := ScaleY(21);
  end;

  Edit4 := TNewEdit.Create(WizardForm);
  with Edit4 do
  begin
    Parent := CustomPage.Surface;
    Left := ScaleX(264);
    Top := ScaleY(98);
    Width := ScaleX(50);
    Height := ScaleY(21);
  end;

  Edit1.TabOrder := 0;
  Edit2.TabOrder := 1;
  Edit3.TabOrder := 2;
  Edit4.TabOrder := 3;
end;


Alloc 21-05-2013 03:51 2153294

Всем привет! Уважаемые знатоки, помогите разобраться со следующей задачей:
Допустим имеется простенький инсталлятор, к которому я прикрутил библиотек isskin.dll способом описанном на том же сайте.
Проблема в том, что если я устанавливаю следующие значения

Код:

DiskSpanning=Yes
SlicesPerDisk=1
DiskSliceSize=1566000000

и компилирую приложение, создается отдельный файл Setup-1.bin, как и должно быть.. так вот если данный файл удалить, при запуске Инсталлятора программа сразу выдает форму в которой просит вставить диск №1.. Если нажать отмену и выйти из процесса установки сразу же выскочит сообщение о том, что isskin.dll не найден. Как обработать это событие? Ведь распаковка isskin.dll происходит на этапе InitializeSetup, а диолог о вставке диска вылезает раньше ее? Как предотвратить данную ошибку в случае если Setup-1.bin не будет найден?

alert30 21-05-2013 04:38 2153297

Alloc, попробуйте скачать другую isskin.dll и сделать те же действия.

Gnom_aka_Lexander 21-05-2013 06:37 2153306

Alloc, просто isskin.dll у тебя внутри Setup-1.bin и при удалении оного, естественно он будет не найден.
вот так такое дело обрабатывается:
читать дальше »
Код:

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

[*code]
var
  sKLoaded : Boolean;

function InitializeSetup(): Boolean;
begin
  sKLoaded := False;
  // грузим скин
  sKLoaded := True;
  Result := True;
end;

procedure DeinitializeSetup();
begin
  if sKLoaded then
  begin
    // выгружаем скин
  end;
end;


by_gangster 21-05-2013 11:02 2153377

Ребята всем привет, возник вопрос по сжатию, мне понравилось сжатие игры Call of Duty MW3... там просто офигенное сжатие, при вскрытии инсталера, я обнаружил файлы связаные с zip (procomp.exe) их там несколько и имели разрешение .exe. В интернете я узнал что самое лучшее сжатие это NanoZip но примеров я не нашёл, если у кого есть примерчик, то выложите пожалуйста...

Gnom_aka_Lexander 21-05-2013 11:17 2153385

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

by_gangster 21-05-2013 12:12 2153400

Gnom_aka_Lexander, а что ещё хорошо сжимает ?

А на сайте nanozip.net чем отличаются архивы для скачивания 32bit и 64bit ?

Gnom_aka_Lexander 21-05-2013 12:22 2153404

by_gangster, по приведенной ссылке - различные параметры для различных типов файлов. логично, что если разложить все ресурсы по полочкам, то при терпеливом подборе параметров очень хорошо сжимает даже винрар. можешь воспользоваться paq, если тебе наплевать на пользователей - сжатие весьма великолепно, но вот распаковка без преувеличение может растянуться на несколько суток(вспомним "знаменитый" репак GTA4). КГБ - аналогично. Если нужно хорошо и быстро - то фриарк с вменяемыми словарями ( словарь - примерно равен свободной нефрагментированной оперативке, которая потребуется для распаковки) с тщательным подбором параметров и препроцессоров (каковых во фриарке - десятки) для каждого типа данных.
Цитата:

Цитата by_gangster
А на сайте nanozip.net чем отличаются архивы для скачивания 32bit и 64bit ? »

Только разрядностью системы в которую можно устанавливать. 32bit можно в любую, 64bit - только в х64. теоретически 64bit может дать лучшее сжатие. Для распаковки не имеет значения разраядность упаковщика, как и в любом пакере или прекомпрессоре.

saurn 21-05-2013 12:25 2153406

Цитата:

Цитата Crazy Noise
Как это реализовать? »

Как-то вот так
Код:

[Code]
var
  SerialPage: TWizardPage;
  Block_1, Block_2, Block_3, Block_4: TNewEdit;
  sNumber: String;

procedure InitializeWizard();
begin
 SerialPage := CreateCustomPage(wpSelectTasks, 'Serial number', 'Please insert serial number');

  Block_1 := TNewEdit.Create(nil);
  with Block_1 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(96), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_2 := TNewEdit.Create(nil);
  with Block_2 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(152), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_3 := TNewEdit.Create(nil);
  with Block_3 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(208), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_4 := TNewEdit.Create(nil);
  with Block_4 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(265), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
  case CurStep of
    ssPostInstall: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
  end;
end;


//или вместо шага CurStepChanged записывать серийник в файл при нажатии "Далее" на этой странице.
//function NextButtonClick(CurPageID:integer): Boolean;
//begin
//  sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
//  case CurPageID of
//    SerialPage.ID: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
//  end;
//  Result := True;
//end;


Проверять сейчас неначем, рабочий комп пока на реставрации.

Alloc 21-05-2013 12:41 2153417

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

Цитата:

Internal error: ExtractTemporaryFile: The file "isskin.dll" was not found.

Gnom_aka_Lexander 21-05-2013 12:44 2153419

Alloc, в декларации функций из isskin.dll добавь отложенный запуск (delayload). а вообще странное желание - заставить работать инсталлятор, отрезав от него большую его часть.. (примерно тоже самое, что пытаться заставить работать голову, отрезав ее от туловища)

saurn 21-05-2013 12:54 2153420

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

[Code]
var
sKLoaded: Boolean;

function InitializeSetup(): Boolean;
begin
  Result := FileExists(ExpandConstant('{src}\Setup-1.bin'));
  if Result then
  // грузим скин
  sKLoaded := True;
end;

procedure DeinitializeSetup();
begin
  if sKLoaded then
  begin
    // выгружаем скин
  end;
end;


Или запихните isskin.dll в ресурсы ексишника

Цитата:

Цитата Alloc
Как предотвратить данную ошибку в случае если Setup-1.bin не будет найден? »

В этом случае и инсталятор уже "не инсталятор". Так что это ненужные пляски с бубном.)))

Alloc 21-05-2013 13:05 2153431

Gnom_aka_Lexander, "delayload" не помогает..

Gnom_aka_Lexander, saurn, нет, я просто хочу чтоб все было идеально) Может все таки можно как то заставить инсталлятор помещать файлы скинов в сам екзешник ну а остальное уже в "Setup-1.bin"?)

Gnom_aka_Lexander 21-05-2013 13:06 2153432

Цитата:

Цитата Alloc
Может все таки можно как то заставить инсталлятор помещать файлы скинов в сам екзешник ну а остальное уже в "Setup-1.bin"?) »

Нет.

saurn 21-05-2013 13:20 2153442

Цитата:

Цитата Alloc
нет, я просто хочу чтоб все было идеально) »

Идеально, если инсталл вообще не запустится при отсутствии некой своей части, или(еще лучше) известит пользователя сообщением. А так...
Цитата:

Цитата Alloc
можно как то заставить инсталлятор помещать файлы скинов в сам екзешник »

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

Alloc 21-05-2013 13:24 2153446

Gnom_aka_Lexander, ясно, наверное действительно "никак".. единственный вариант который предложил saurn, запихнуть библиотеку в ресурсы екзешника.

Большое спасибо всем за помощь!

saurn 21-05-2013 13:35 2153455

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

Gnom_aka_Lexander 21-05-2013 13:39 2153458

saurn, не мучайся. пока скрипта не увидишь - все равно ничем помочь не сможешь. я-то уже знаю решение, но нужно удостовериться, что я прав. а для этого нужно видеть скрипт.

saurn 21-05-2013 15:23 2153499

Aquila, ну а трабла то в чем?

Aquila 21-05-2013 15:27 2153502

saurn, Трабла в том, что я не знаю как это сделать

saurn 21-05-2013 15:33 2153509

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

Aquila 21-05-2013 15:37 2153513

Цитата:

Цитата saurn
Имеется ввиду установка через ком.строку с различными параметрами? »

Да

saurn 21-05-2013 15:40 2153517

Aquila, всё, что могу подсказать по этому вопросу: использовать файл ответов - свой для каждой конфигурации.
Код:

/LOADINF="filename"
Указывает инсталлятору загрузить параметры установки из указанного файла после проверки командной строки. Этот файл может быть подготовлен с помощью '/SAVEINF=' command.

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

/SAVEINF="filename"
Указывает инсталлятору сохранять параметры установки в указанный файл.

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

Все параметры командной строки Inno

Aquila 21-05-2013 15:44 2153522

saurn, Об этом я знаю :sorry: Придётся использовать NSIS (там есть то что я хочу).

saurn 21-05-2013 15:50 2153528

Aquila, насчет добавления ярлыков в различные дериктории: в секции [Tasks] можно задать опционально для всех ярлыков, а потом через ком. строку выбирать необходимые ярлыки
Код:

/TASKS="desktopicon,groupicon"
Тот же способ и для компонентов. Пожалуй это и всё.

Crazy Noise 21-05-2013 16:00 2153537

saurn, Благодарю!
Скрипт рабочий, если добавить в него [Dirs].
читать дальше »
Код:

[Dirs]
Name: {userdocs}\GameEX

[code]
var
  SerialPage: TWizardPage;
  Block_1, Block_2, Block_3, Block_4: TNewEdit;
  sNumber: String;

procedure InitializeWizard();
begin
 SerialPage := CreateCustomPage(wpSelectTasks, 'Serial number', 'Please insert serial number');

  Block_1 := TNewEdit.Create(nil);
  with Block_1 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(96), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_2 := TNewEdit.Create(nil);
  with Block_2 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(152), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_3 := TNewEdit.Create(nil);
  with Block_3 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(208), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_4 := TNewEdit.Create(nil);
  with Block_4 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(265), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
  case CurStep of
    ssPostInstall: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
  end;
end;



Но что делать если использовать второй вариант
читать дальше »
Код:

//или вместо шага CurStepChanged записывать серийник в файл при нажатии "Далее" на этой странице.
(*function NextButtonClick(CurPageID:integer): Boolean;
begin
  sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
  case CurPageID of
    SerialPage.ID: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
  end;
  Result := True;
end;*)

где создание папки GameEX через [Dirs] не прокатит?

saurn 21-05-2013 16:06 2153545

Crazy Noise, не подумал, что папки изначально не существует)
Код:

function NextButtonClick(CurPageID:integer): Boolean;
begin
  sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
  case CurPageID of
    SerialPage.ID:
    begin
      CreateDir(ExpandConstant('{userdocs}\GameEX'));
      SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
    end;
  end;
  Result := True;
end;


Crazy Noise 21-05-2013 16:50 2153576

Вложений: 1
saurn, Благодарю.
Цитата:

Цитата saurn
не подумал, что папки изначально не существует) »

Да это я ничего про папку не упомянул, не думал что так получится.


Aquila, Попробую привести пример на основе bat+ini, т.е bat-ник подхватывает настройки указанные в файле ini
пример скрипта

Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
DefaultGroupName=My Application
OutputBaseFilename=setup
OutputDir=.

[Icons]
Name: "{group}\{cm:UninstallProgram,My Application}"; Filename: "{uninstallexe}"

[Components]
Name: a; Description: A; Types: full custom compact; Flags: checkablealone
Name: a\a; Description: A\A; Types: custom compact; Flags: dontinheritcheck
Name: a\b; Description: A\B; Types: custom compact; Flags: dontinheritcheck
Name: a\c; Description: A\C; Types: custom compact; Flags: dontinheritcheck

[Tasks]
Name: a; Description: A; Flags: checkablealone
Name: a\a; Description: A\A; Flags: dontinheritcheck
Name: a\b; Description: A\B; Flags: unchecked dontinheritcheck
Name: a\c; Description: A\C; Flags: unchecked dontinheritcheck


батник

Код:

setup.exe /LoadInf=".\unattended.ini"

файл unattended.ini

Код:

[Setup]
Components=a,a\b,a\c
Tasks=a,a\b,a\c



таким образом, можно ювелирно всё настроить.
Так же можно подсмотреть в ветке реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Application_is1
Inno Setup: Selected Components
Inno Setup: Selected Tasks
и т.д.

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

setup.exe /Components="a,a\b,a\c" /Tasks="a,a\b,a\c"
Ниже прикрутил архив.

saurn 21-05-2013 16:58 2153581

Crazy Noise, еще можно реализовать проверку на присутствие файла с серийником, и если он есть, не создавать или пропускать страницу ввода(например при переустановке поверх).

Crazy Noise 21-05-2013 17:08 2153588

saurn, И об этом я не подумал. Угадываешь мысли?
Пример можно? Не силён в таких мелочах.

saurn 21-05-2013 17:26 2153599

Crazy Noise, вот самодостаточный пример. Единственный его минус, точнее два минуса: будет работать только, если всегда вводится один и тот же серийник, и второй минус - чувствительность к регистру букв в серийнике. Ну а принцип прост: если определенный серийный номер(серийник задается в константе) не найден, страница создается. В противном случае пропускается. Короче, если даже *.ini файл присутствует, но он пустой, или в нем указан другой серийник страница будет создана. Чтение строки из файла воспроизвел по мотивам примера от Johny777)
Пример
Код:

[Code]
const
SERIAL_NUMBER = '1234-5678-ABCD-EFGH';

var
  SerialPage: TWizardPage;
  Block_1, Block_2, Block_3, Block_4: TNewEdit;
  sNumber, OldNumber: String;

function PreviousData(const SearchNumber: String): Boolean;
begin
  if OldNumber = '' then LoadStringFromFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), OldNumber);
  Result := Pos(SearchNumber, OldNumber) > 0;
end;

procedure InitializeWizard();
begin
 SerialPage := CreateCustomPage(wpSelectTasks, 'Serial number', 'Please insert serial number');

  Block_1 := TNewEdit.Create(nil);
  with Block_1 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(96), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_2 := TNewEdit.Create(nil);
  with Block_2 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(152), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_3 := TNewEdit.Create(nil);
  with Block_3 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(208), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;

  Block_4 := TNewEdit.Create(nil);
  with Block_4 do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(265), ScaleY(98), ScaleX(50), ScaleY(21));
    Text := '';
    MaxLength := 4;
  end;
end;

function NextButtonClick(CurPageID:integer): Boolean;
begin
  case CurPageID of
    SerialPage.ID:
    begin
      CreateDir(ExpandConstant('{userdocs}\GameEX'));
      sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
      SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, False);
    end;
  end;
  Result := True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    SerialPage.ID: Result := PreviousData(SERIAL_NUMBER);
  end;
end;


Crazy Noise 21-05-2013 17:48 2153609

Цитата:

Цитата saurn
Единственный его минус, точнее два минуса: будет работать только, если всегда вводится один и тот же серийник, и второй минус - чувствительность к регистру букв в серийнике. »

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

by_gangster 21-05-2013 18:43 2153640

Gnom_aka_Lexander, Пришёл домой и скачал с nanozip.net, но там нету скриптов... Где их взять ?

saurn 21-05-2013 18:53 2153645

Crazy Noise, ну если так, то можно ограничится только поиском файла. Изменил условие, плюс немного переделал скрипт. Получился короче. Но, опять таки же, не проверял)
Пример
Код:

[CustomMessages]
MESSAGES_1=Ввод серийного номера
MESSAGES_2=Серийный номер нужен для активации программного обеспечения.
MESSAGES_3=Для активации необходимо ввести серийный номер поставляемый в комплекте с программным обеспечением.

[code]
var
  SerialPage: TWizardPage;
  Edits: array [1..4] of TEdit;
  I, E: Integer;
  SerialPage_Label: TNewStaticText;
  sNumber: String;

function EditsNumber(): string;
begin
  for I := 1 to 4 do
  begin
    sNumber :=  sNumber + Edits[i].Text + '-';
  end;
  sNumber := Copy(sNumber, 1, Length(sNumber) - 1);
  Result := sNumber;
end;

procedure InitializeWizard();
begin
  SerialPage := CreateCustomPage(wpSelectTasks, CustomMessage('MESSAGES_1'), CustomMessage('MESSAGES_2'));
  SerialPage_Label := TNewStaticText.Create(nil);
  with SerialPage_Label do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(28));
    WordWrap := True;
    Caption := CustomMessage('MESSAGES_3');
  end;
 
  E := ScaleX(73);

  for I := 1 to 4 do
  begin
    Edits[i]:= TEdit.Create(nil);
    with Edits[i] do
    begin
      Parent:= SerialPage.Surface;
      SetBounds(0 + (E*I), ScaleY(47), ScaleX(47), ScaleY(21));
      MaxLength:= 4;
    end;
  end;
end;

function NextButtonClick(CurPageID:integer): Boolean;
begin
  case CurPageID of
    SerialPage.ID:
    begin
      CreateDir(ExpandConstant('{userdocs}\GameEX'));
      SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), EditsNumber, False);
    end;
  end;
  Result := True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    SerialPage.ID: Result := FileExists(ExpandConstant('{userdocs}\GameEX\keysgame.ini'));
  end;
end;


Gnom_aka_Lexander 21-05-2013 18:57 2153649

by_gangster, а кто сказал, что там обязаны быть скрипты под инно? я-ж писал - с функциями exec думаю, разберешься без посторонней помощи? в справке к нанозипу однозначно есть пример распаковки командами.

by_gangster 21-05-2013 19:57 2153689

Gnom_aka_Lexander, Короче просто напросто подскажи как сжать игру размером 8.52 ГБ ? У меня сжимет только до 7.20 Гб

Mailchik 21-05-2013 20:01 2153695

Цитата:

Цитата by_gangster
Короче просто напросто подскажи как сжать игру размером 8.52 ГБ ? У меня сжимет только до 7.20 Гб »

Короче никак.
----------------------------------------------------------------------------------------------------
Цитата:

Цитата Aquila
Здравствуйте. Моя трабла такова, хочу сделать установочник в котором хотел бы использовать несколько ключей установки, в частности для добавления в различные директории ярлыки программы, подскажите пожалуйста кто чем может. »

Накидал пример..
Если среди ключей запуска есть 'iGroup' - создаётся ярлык в меню пуск, 'iDesktop' - создаётся ярлык на рабочем столе, если оба ключа - создаются оба ярлыка.. Принцип думаю ясен.
читать дальше »
Код:

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

[Icons]
Name: {group}\test; Filename: {srcexe}; WorkingDir: {src}; IconFilename: {srcexe}; Check: CheckParam('iGroup');
Name: {commondesktop}\test; Filename: {srcexe}; WorkingDir: {src}; IconFilename: {srcexe}; Check: CheckParam('iDesktop');

[Code]
function CheckParam(s: string): boolean;
var
 i: integer;
 begin
  for i := 0 to ParamCount do begin
  Result := ParamStr(i) = s;
  if Result then Break;
  end;
end;


Aquila 21-05-2013 20:07 2153699

Mailchik, А можно по подробнее? Например в командной строке какой ключ надо ввести чтобы создался ярлык на рабочем столе? Или это опять же через /LOADINF?

Gnom_aka_Lexander 21-05-2013 20:14 2153702

Цитата:

Цитата Aquila
какой ключ надо ввести чтобы создался ярлык на рабочем столе? »

Цитата:

Цитата Mailchik
'iDesktop' - создаётся ярлык на рабочем столе »


Mailchik 21-05-2013 20:15 2153703

Aquila, setup.exe iDesktop - создастся ярлык на рабочем столе..
изучите код, который я выше написал.. в секции Icons идёт проверка на каждый ярлык. Для рабочего стола идёт Check: DesktopIcon;, для меню "Пуск" - Check: GroupIcon;

Aquila 21-05-2013 20:23 2153709

Mailchik, А этот чек ( Check: ) можно применить не только к [Icons]?

saurn 21-05-2013 20:55 2153724

Aquila, аналогично к [Dirs], [Files], [Registry], [INI], [Run] и т.д.

Crazy Noise 21-05-2013 20:56 2153726

Aquila,

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

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

[Components]
Name: ag; Description: Aquila; Check: AquilaComp

[Icons]
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}; Check: GroupIcon
Name: {commondesktop}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}; Check: DesktopIcon
Name: {commondesktop}\Aquila\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}; Check: AquilaIcon


[Code]
function CheckParam(s: string): boolean;
var
 i: integer;
 begin
  for i := 0 to ParamCount do begin
  Result := ParamStr(i) = s;
  if Result then Break;
  end;
end;


function GroupIcon: boolean;
 begin
  Result := CheckParam('iGroup');
end;


function DesktopIcon: boolean;
 begin
  Result := CheckParam('iDesktop');
end;



function AquilaIcon: boolean;
 begin
  Result := CheckParam('iAquila');
end;



// Можно и к компонентам прикрутить
function AquilaComp: boolean;
 begin
  Result := CheckParam('iAquilaComponents');
end;



Как в исходном коде приведённый в посте от Mailchik
Код:

setup.exe iAquila
Пример для компонентов
Код:

setup.exe iAquilaComponents

Aquila 21-05-2013 21:23 2153735

Цитата:

Цитата Crazy Noise
iAquilaComponents »

Красиво :happy:

Crazy Noise 22-05-2013 04:20 2153845

Цитата:

Цитата saurn
опять таки же, не проверял »

Благодарю! Проверил, работает.

Сейчас зациклился на MsgBox. Где-то что-то не правильно делаю, либо вообще не туда полез.
Т.к ключ должен быть в любом случае, то значит должна быть проверка на то введён ключ в инсталляторе или нет
т.е если в инсталляторе окошки пусты, либо не хватает буквы или цифры то при нажатии на далее выводил сообщение MsgBox('Вы должны ввести ключ.', mbError, MB_OK);, либо же кнопка далее была бы не активна до тех пор пока весь ключ не будет введён, вот что-то одно.

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

function NextButtonClick(CurPageID:integer): Boolean;
begin
  case CurPageID of
    SerialPage.ID:
    begin
      CreateDir(ExpandConstant('{userdocs}\GameEX'));
      SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), EditsNumber, False);
      MsgBox('Вы должны ввести ключ.', mbError, MB_OK);
    end;
  end;
  Result := True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    SerialPage.ID: Result := FileExists(ExpandConstant('{userdocs}\GameEX\keysgame.ini'));
  end;
end;


Mailchik 22-05-2013 09:00 2153879

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

function NextButtonClick(CurPageID:integer): Boolean;
var
 i: integer;
begin
  Result := True;
  case CurPageID of
    SerialPage.ID:
    begin
      CreateDir(ExpandConstant('{userdocs}\GameEX'));
      SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), EditsNumber, False);
      for i := 1 to 4 do begin
      Result := Edits[i].GetTextLen = 4;
      if not Result then begin
        MsgBox('Вы должны ввести ключ.', mbError, MB_OK);
        Break;
      end;
      end;
    end;
  end;
end;


Crazy Noise 22-05-2013 15:27 2154044

Mailchik, Благодарю!
А как сделать, чтоб когда набираешь код, то автоматически переходило в следующее окошко, а не так чтоб мышью выбирать? Возможно так сделать?

Mailchik 22-05-2013 19:08 2154182

Цитата:

Цитата Crazy Noise
А как сделать, чтоб когда набираешь код, то автоматически переходило в следующее окошко, а не так чтоб мышью выбирать? Возможно так сделать? »

В двух вариантах:
Цитата:

Цитата Crazy Noise
если в инсталляторе окошки пусты, либо не хватает буквы или цифры то при нажатии на далее выводил сообщение »

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

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

[CustomMessages]
MESSAGES_1=Ввод серийного номера
MESSAGES_2=Серийный номер нужен для активации программного обеспечения.
MESSAGES_3=Для активации необходимо ввести серийный номер поставляемый в комплекте с программным обеспечением.

[code]
var
  SerialPage: TWizardPage;
  Edits: array [1..4] of TEdit;
  I, E: Integer;
  SerialPage_Label: TNewStaticText;
  sNumber: String;

procedure EditsChange(Sender: TObject);
var
 i: integer;
 begin
 for i := 1 to 4 do begin
  Edits[i].AutoSelect := False;
  if i < 4 then
  if Length(Edits[i].Text) = 4 then
    Edits[i+1].SetFocus;
  end;
end;

function EditsNumber(): string;
begin
  for I := 1 to 4 do
  begin
    sNumber :=  sNumber + Edits[i].Text + '-';
  end;
  sNumber := Copy(sNumber, 1, Length(sNumber) - 1);
  Result := sNumber;
end;

procedure InitializeWizard();
begin
  SerialPage := CreateCustomPage(wpSelectTasks, CustomMessage('MESSAGES_1'), CustomMessage('MESSAGES_2'));
  SerialPage_Label := TNewStaticText.Create(nil);
  with SerialPage_Label do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(28));
    WordWrap := True;
    Caption := CustomMessage('MESSAGES_3');
  end;

  E := ScaleX(73);

  for I := 1 to 4 do
  begin
    Edits[i]:= TEdit.Create(nil);
    with Edits[i] do
    begin
      Parent:= SerialPage.Surface;
      SetBounds(0 + (E*I), ScaleY(47), ScaleX(47), ScaleY(21));
      MaxLength:= 4;
      OnChange := @EditsChange;
    end;
  end;
end;

function NextButtonClick(CurPageID:integer): Boolean;
var
 i: integer;
begin
  Result := True;
  case CurPageID of
    SerialPage.ID:
    begin
      CreateDir(ExpandConstant('{userdocs}\GameEX'));
      SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), EditsNumber, False);
      for i := 1 to 4 do begin
      Result := Edits[i].GetTextLen = 4;
      if not Result then begin
        MsgBox('Вы должны ввести ключ.', mbError, MB_OK);
        Break;
      end;
      end;
    end;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    SerialPage.ID: Result := FileExists(ExpandConstant('{userdocs}\GameEX\keysgame.ini'));
  end;
end;


-------------------------------------------------------------------------------------
Цитата:

Цитата Crazy Noise
либо же кнопка далее была бы не активна до тех пор пока весь ключ не будет введён »

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

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

[CustomMessages]
MESSAGES_1=Ввод серийного номера
MESSAGES_2=Серийный номер нужен для активации программного обеспечения.
MESSAGES_3=Для активации необходимо ввести серийный номер поставляемый в комплекте с программным обеспечением.

[code]
var
  SerialPage: TWizardPage;
  Edits: array [1..4] of TEdit;
  I, E: Integer;
  SerialPage_Label: TNewStaticText;
  sNumber: String;

procedure EditsChange(Sender: TObject);
var
 i, eLength: integer;
 begin
 eLength := 0;
 for i := 1 to 4 do begin
  Edits[i].AutoSelect := False;
  if i < 4 then
  if Length(Edits[i].Text) = 4 then
    Edits[i+1].SetFocus;
  eLength := eLength + Length(Edits[i].Text);
  end;
 WizardForm.NextButton.Enabled := eLength = 4 * 4;
end;

function EditsNumber(): string;
begin
  for I := 1 to 4 do
  begin
    sNumber :=  sNumber + Edits[i].Text + '-';
  end;
  sNumber := Copy(sNumber, 1, Length(sNumber) - 1);
  Result := sNumber;
end;

procedure InitializeWizard();
begin
  SerialPage := CreateCustomPage(wpSelectTasks, CustomMessage('MESSAGES_1'), CustomMessage('MESSAGES_2'));
  SerialPage_Label := TNewStaticText.Create(nil);
  with SerialPage_Label do
  begin
    Parent := SerialPage.Surface;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(28));
    WordWrap := True;
    Caption := CustomMessage('MESSAGES_3');
  end;

  E := ScaleX(73);

  for I := 1 to 4 do
  begin
    Edits[i]:= TEdit.Create(nil);
    with Edits[i] do
    begin
      Parent:= SerialPage.Surface;
      SetBounds(0 + (E*I), ScaleY(47), ScaleX(47), ScaleY(21));
      MaxLength:= 4;
      OnChange := @EditsChange;
    end;
  end;
end;

function NextButtonClick(CurPageID:integer): Boolean;
var
 i: integer;
begin
  Result := True;
  case CurPageID of
    SerialPage.ID:
    begin
      CreateDir(ExpandConstant('{userdocs}\GameEX'));
      SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), EditsNumber, False);
    end;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    SerialPage.ID: Result := FileExists(ExpandConstant('{userdocs}\GameEX\keysgame.ini'));
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
 begin
 if CurPageID = SerialPage.ID then
  EditsChange(nil);
end;


habib2302 24-05-2013 10:16 2155308

как добавить чекбокс на создание резервной копии файлов?

saurn 24-05-2013 10:48 2155331

Цитата:

Цитата habib2302
как добавить чекбокс на создание резервной копии файлов? »

Например, так
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
OutputDir=...
Compression=none

[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}; BeforeInstall: CreateBackup(); Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;

[Code]
#ifdef UNICODE
 type
  PChar = PAnsiChar;
#endif

function MoveFile(const TargetFile, BackupFile: PChar):Integer; external 'MoveFileA@kernel32.dll stdcall';

var
  CreateBackup_On_Off: TNewCheckBox;

function CheckedBoxes(const iParams: Integer): Boolean;
begin
  case iParams of
    1: Result := CreateBackup_On_Off.Checked;
  end;
end;

procedure CreateBackup();
var
  FinalDir, TargetFile, BackupFile, TargetPath, ShortPath: String;
begin
  if CheckedBoxes(1) then
  begin
    TargetPath:= ExpandConstant('{app}');
    TargetFile:= ExpandConstant(CurrentFileName);
    FinalDir := AddBackslash(ExpandConstant('{app}\Original.old')) + GetDateTimeString('YYYY/MM/DD', '-', '-');
    ShortPath:= TargetFile;
    StringChangeEx(ShortPath, TargetPath, '', True);
    BackupFile:= FinalDir + ShortPath;
    ForceDirectories(ExtractFilePath(BackupFile));
    MoveFile(PChar(TargetFile), PChar(BackupFile));
  end;
end;

procedure InitializeWizard();
begin
  CreateBackup_On_Off := TNewCheckBox.Create(nil);
  with CreateBackup_On_Off do
  begin
    Parent := WizardForm.SelectDirPage;
    SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + 30, WizardForm.DirEdit.Width, WizardForm.DirEdit.Height);
    Caption := 'Сохранить резервную копию перезаписываемых файлов';
  end;
end;


habib2302 24-05-2013 11:24 2155361

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

saurn 24-05-2013 11:51 2155380

Цитата:

Цитата habib2302
чтоьы инсталятор перед установкой закрыл процессы »

В шапке пример Закрытие процесса от El Sanchez

wertulll 25-05-2013 05:58 2155894

Всем Привет! Подскажите пожалуйста как к этому скрипту прикрутить ISDone0.6final?

Скрипт
читать дальше »

#define MyAppName "S.T.A.L.K.E.R. Зов Припяти"
#define AppVerName "S.T.A.L.K.E.R. Зов Припяти"
#define MyAppExeName "MyProg.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#AppVerName}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
WizardImageFile=Files\WizardImage.bmp
WizardSmallImageFile=Files\WizardSmallImage.bmp

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

[Tasks]
Name: desktopicon; Description: Создать значок на Рабочем столе; GroupDescription: Дополнительные значки:

[Files]
Source: Files\*; Flags: dontcopy
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[code]
const
Color = clblack;
ButtonWidth = 80;
ButtonHeight = 23;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;
var
ButtonPanel: array [0..4] of TPanel;
ButtonImage: array [0..4] of TBitmapImage;
ButtonLabel: array [0..4] of TLabel;

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}\button.bmp'))
Image.Parent:=Panel
ButtonImage[AButtonIndex]:=Image


Labl:=TLabel.Create(WizardForm)
Labl.Top := 5
Labl.Width := Panel.Width
Labl.Height := Panel.Height
Labl.Autosize := False
Labl.Alignment := taCenter
Labl.Tag:=AButtonIndex
Labl.Enabled:= AButton.Enabled
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;

var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel: TLabel;

procedure InitializeWizard();
begin
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:=337
WizardForm.DirBrowseButton.Width:=ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight
WizardForm.GroupBrowseButton.Left:=337
WizardForm.GroupBrowseButton.Width:=ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick
WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton,bidBack)
LoadButtonImage(WizardForm.NextButton,bidNext)
LoadButtonImage(WizardForm.CancelButton,bidCancel)
LoadButtonImage(WizardForm.DirBrowseButton,bidDirBrowse)
LoadButtonImage(WizardForm.GroupBrowseButton,bidGroupBrowse)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.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.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

WelcomeLabel1:= TLabel.Create(WizardForm);
WelcomeLabel1.AutoSize:= False;
with WizardForm.WelcomeLabel1 do
WelcomeLabel1.SetBounds(ScaleX(240), ScaleY(20), ScaleX(230), ScaleY(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(ScaleX(240), ScaleY(100), ScaleX(230), ScaleY(200));
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:= WizardForm.WelcomeLabel2.Caption;
WelcomeLabel2.Parent:= WizardForm.WelcomePage

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(240), ScaleY(20), ScaleX(230), ScaleY(200));
FinishedHeadingLabel.Font:= WizardForm.FinishedHeadingLabel.Font
FinishedHeadingLabel.Font.Color:= clWhite;
FinishedHeadingLabel.Transparent:= True;
FinishedHeadingLabel.WordWrap:= true;
FinishedHeadingLabel.Caption:= WizardForm.FinishedHeadingLabel.Caption;
FinishedHeadingLabel.Parent:= WizardForm.FinishedPage

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
FinishedLabel.SetBounds(ScaleX(240), ScaleY(100), ScaleX(230), ScaleY(220));
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Caption:= WizardForm.FinishedLabel.Caption;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButton(WizardForm.BackButton,bidBack)
UpdateButton(WizardForm.NextButton,bidNext)
UpdateButton(WizardForm.CancelButton,bidCancel)
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
FinishedLabel.Caption:= WizardForm.FinishedLabel.Caption;
end;

saurn 25-05-2013 18:17 2156151

wertulll
Пример
Код:

#define MyAppName "S.T.A.L.K.E.R. Зов Припяти"
#define AppVerName "S.T.A.L.K.E.R. Зов Припяти"
#define MyAppExeName "MyProg.exe"
#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={#MyAppName}
AppVerName={#AppVerName}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
WizardImageFile=Files\WizardImage.bmp
WizardSmallImageFile=Files\WizardSmallImage.bmp
OutputDir=...
#ifdef NeedSize
ExtraDiskSpaceRequired={#NeedSize}
#endif

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

#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

[Tasks]
Name: desktopicon; Description: Создать значок на Рабочем столе; GroupDescription: Дополнительные значки:

[Files]
Source: Files\*; Flags: dontcopy
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

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[CustomMessages]
russian.ExtractedFile=Извлекается файл:
russian.Extracted=Распаковка архивов...
russian.CancelButton=Отменить распаковку
russian.Error=Ошибка распаковки!
russian.ElapsedTime=Прошло:
russian.RemainingTime=Осталось времени:
russian.EstimatedTime=Всего:
russian.AllElapsedTime=Время установки:

[code]
const
Color = clblack;
ButtonWidth = 80;
ButtonHeight = 23;
PCFonFLY=true;
notPCFonFLY=false;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;

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

var
ButtonPanel: array [0..4] of TPanel;
ButtonImage: array [0..4] of TBitmapImage;
ButtonLabel: array [0..4] of TLabel;

LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
LabelPct2: TLabel;
ISDoneProgressBar2:TNewProgressBar;
#endif
MyCancelButton: TButton;
ISDoneCancel:integer;
ISDoneError:boolean;
PCFVer:double;

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 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}\button.bmp'))
Image.Parent:=Panel
ButtonImage[AButtonIndex]:=Image


Labl:=TLabel.Create(WizardForm)
Labl.Top := 5
Labl.Width := Panel.Width
Labl.Height := Panel.Height
Labl.Autosize := False
Labl.Alignment := taCenter
Labl.Tag:=AButtonIndex
Labl.Enabled:= AButton.Enabled
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;

var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel: TLabel;

procedure InitializeWizard();
begin
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:=337
WizardForm.DirBrowseButton.Width:=ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight
WizardForm.GroupBrowseButton.Left:=337
WizardForm.GroupBrowseButton.Width:=ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick
WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton,bidBack)
LoadButtonImage(WizardForm.NextButton,bidNext)
LoadButtonImage(WizardForm.CancelButton,bidCancel)
LoadButtonImage(WizardForm.DirBrowseButton,bidDirBrowse)
LoadButtonImage(WizardForm.GroupBrowseButton,bidGroupBrowse)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.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.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

WelcomeLabel1:= TLabel.Create(WizardForm);
WelcomeLabel1.AutoSize:= False;
with WizardForm.WelcomeLabel1 do
WelcomeLabel1.SetBounds(ScaleX(240), ScaleY(20), ScaleX(230), ScaleY(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(ScaleX(240), ScaleY(100), ScaleX(230), ScaleY(200));
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:= WizardForm.WelcomeLabel2.Caption;
WelcomeLabel2.Parent:= WizardForm.WelcomePage

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(240), ScaleY(20), ScaleX(230), ScaleY(200));
FinishedHeadingLabel.Font:= WizardForm.FinishedHeadingLabel.Font
FinishedHeadingLabel.Font.Color:= clWhite;
FinishedHeadingLabel.Transparent:= True;
FinishedHeadingLabel.WordWrap:= true;
FinishedHeadingLabel.Caption:= WizardForm.FinishedHeadingLabel.Caption;
FinishedHeadingLabel.Parent:= WizardForm.FinishedPage

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
FinishedLabel.SetBounds(ScaleX(240), ScaleY(100), ScaleX(230), ScaleY(220));
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Caption:= WizardForm.FinishedLabel.Caption;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButton(WizardForm.BackButton,bidBack)
UpdateButton(WizardForm.NextButton,bidNext)
UpdateButton(WizardForm.CancelButton,bidCancel)
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
FinishedLabel.Caption:= WizardForm.FinishedLabel.Caption;
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;


neorom 25-05-2013 22:16 2156259

Как сделать обводку у текста, допустим текст белый а обводка чёрная, всё перерыл, не где не нашёл и зделать тень (без добавления нового TLabel)
Вот участок кода:
читать дальше »
PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left := ScaleX(45);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := clwhite;
Font.Style := [fsBold];
Transparent := True;
Parent := WizardForm.MainPanel;
end;

Johny777 26-05-2013 02:21 2156356

neorom,
Цитата:

Цитата neorom
без добавления нового TLabel (имитирующего тень) »

раз уж такое требование, то используй GDI графику или другими совами "рисуй на канве" (класс TCanvas, методы которого я советую изучить всем (хотя в инно они урезаны), кто их не знает. Пригодится!).
http://www.az-design.ru/index.shtml?...Delphi/D3/SB20

Пример:

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


const
   
TRANSPARENT = 1;
   
type
   
HDC = LongWord;
   
function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';

procedure WizardFormOnPaint(Sender: TObject);
begin
    with
TWizardForm(Sender).Canvas do
    begin
       
SetBKMode(Handle, TRANSPARENT);
        Font.Name := 'Arial';
        Font.Size := 48;
        Font.Color := clBlack;
        TextOut (14, 14, 'neorom');
        Font.Color :=clRed;
        TextOut (10, 10, 'neorom');
    end;
end;

procedure InitializeWizard();
begin
   
WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;


PS: это я портировал с делфи.

neorom 26-05-2013 13:05 2156510

А как на счота обводки букв(текста) ?

Johny777 26-05-2013 17:25 2156627

neorom,
Цитата:

Цитата neorom
А как на счота обводки букв(текста) ? »

Протировал с некоторыми изменениями и улучшениями отсюда http://www.cyberforum.ru/delphi-begi...ead553467.html
теперь создание надписей через процедуры CreateTextWithBorder(...), CreateTextWithShadow(...), что намного практичнее и проще
что отправлять им в качестве аргументов понятно по названиям ссылок в заголовках и переменных в структуре _LITTLE_FONT_INFO
процедура CreateSquare(...) - бонус - создаёт прямоугольник. Кстати то что не умеет инно можно дополнить WinApi функциями из gdi32.dll. Пример такого подхода в шапке, в "создании кастомного чекбокса"
читать дальше »
Код:

const
   
TRANSPARENT = 1;
   
    STEAM_GREEN = $506a5a;
   

type
   
HDC = LongWord;
   
    _LITTLE_FONT_INFO = record
     
Style: TFontStyles;
      Size: Integer;
      Name: String;
    end;

   
function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';


procedure CreateTextWithShadow(Canvas: TCanvas; const Text: String; const FontInfo: _LITTLE_FONT_INFO; const TextLeft, TextTop, TextColor, ShadowColor, ShadowLeft, ShadowTop: Integer);
begin
    with
Canvas do
    begin
       
Font.Color := ShadowColor;
        Font.Size := FontInfo.Size;
        Font.Name := FontInfo.Name;
        Font.Style := FontInfo.Style;
        TextOut(TextLeft + ShadowLeft, TextTop + ShadowTop, Text);
        Font.Color := TextColor;
        TextOut(TextLeft, TextTop, Text);
    end;
end;


procedure CreateTextWithBorder(Canvas: TCanvas; const Text: String; const FontInfo: _LITTLE_FONT_INFO; const TextLeft, TextTop, TextColor, ShadowColor, BorderWidth: Integer);
begin
    with
Canvas do
    begin
       
Font.Color := ShadowColor;
        Font.Size := FontInfo.Size;
        Font.Name := FontInfo.Name;
        Font.Style := FontInfo.Style;
        TextOut(TextLeft + BorderWidth, TextTop + BorderWidth, Text);
        TextOut(TextLeft - BorderWidth, TextTop - BorderWidth, Text);
        TextOut(TextLeft + BorderWidth, TextTop - BorderWidth, Text);
        TextOut(TextLeft - BorderWidth, TextTop + BorderWidth, Text);
        Canvas.Font.Color := TextColor;
        TextOut(TextLeft, TextTop, Text);
    end;
end;


procedure CreateSquare(Canvas: TCanvas; const Left, Top, Width, Height, BorderWidth, BorderColor: Integer);
begin
    with
Canvas do
    begin
       
Pen.Color := BorderColor;
        Pen.Width := BorderWidth;
        MoveTo(Left, Top);
        LineTo(Left, Top + Height);
        LineTo(Left + Width, Top + Height);
        LineTo(Left + Width, Top);
        LineTo(Top, Left);
    end;
end;


procedure WizardFormOnPaint(Sender: TObject);
var
   
lfi: _LITTLE_FONT_INFO;
begin
   
SetBKMode(TWizardForm(Sender).Canvas.Handle, TRANSPARENT);

    lfi.Style := [fsBold];
    lfi.Size := 54;
    lfi.Name := 'Tahoma';
    CreateTextWithBorder(TWizardForm(Sender).Canvas, 'VALVE', lfi, ScaleX(16), ScaleY(16), clBlack, clWhite, 1);
   
    lfi.Style := [];
    lfi.Size := 24;
    lfi.Name := 'Arial';
    CreateTextWithShadow(TWizardForm(Sender).Canvas, 'VALVE', lfi, ScaleX(127), ScaleY(77), clWhite, clBlack, 4, 3);
   
    CreateSquare(TWizardForm(Sender).Canvas, ScaleX(5), ScaleY(5), ScaleX(300), ScaleY(120), 1, clWhite);
end;


procedure InitializeWizard();
begin
   
WizardForm.Color := STEAM_GREEN;
    WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;


скрин:

neorom 27-05-2013 09:54 2156968

Уважаэмий Johny777 прошу вас виложить отдельно скрипт для тени текста, и скрипт для обводки текста бо у меня их розєденить чтото не получаэться ( и чтоби текст VALVE отображался на странице вибора папкм установки). Спасибо.

Johny777 28-05-2013 00:33 2157422

neorom,
Цитата:

Цитата neorom
и скрипт для обводки текста бо у меня их розєденить чтото не получаэться »

да я вроде старался всё структурировано сделать. Ну да ладно, ведь ты говоришь:
Цитата:

Цитата neorom
и чтоби текст VALVE отображался на странице вибора папкм установки »

Тут проблема. Страница выбора директории это TNewNotebookPage и у неё и её предков нет подкласса TCanvas, а значит нарисовать тект на ней как в пред примере нге получится, разве что на вин апи, но мне сейчас туда нет времени лезть, поэтому предлагаю так: создавать на подобных Окнах TBitmapImage и рисовать на нём, а именно
TBitmapImage->TBitmap->TCanvas.
чтоб создать такой рисунок нужно много параметров и чтобы не получился километровый заголовок функции я написал свой тип = структура _BORDER_TEXT_STRUCT и _SHADOW_TEXT_STRUCT в соответствии для каждого примера. Всё работает предельно просто.
1. Мы объявляем ссылку на структуру
2. запоняем её (структуру)
3. отправляем в функцию и получаем на выходе старый добрый TBitmapImage, с которым умеет работать думаю каждый
как ты просил - два отдельных примера с комментариями
1-пример создания текста с тенью:
читать дальше »
Код:

const
   
TRANSPARENT = 1;

type
   
HDC = LongWord;

function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';

type
   
_SHADOW_TEXT_STRUCT = record
       
Parent: TWinControl; // родитель картинки
       
BackgroundColor: Integer; // цвет фона (катника получится прямоугольной. Поэтому всё, что в пределах прямоугольника, можно закрасить этим цветом перед тем как туда врисуется текст)
       
FontStyle: TFontStyles; // стиль шрафта (если ничего не приваивать, то будет стиль по-умолчанию)
       
FontSize: Integer; // размер шрифта (если ничего не приваивать, то будет размер шрифта по-умолчанию)
       
FontName: String; // имя шрифта (если ничего не приваивать (не рекомендую), то будет имя шрифта по-умолчанию)
       
ShadowColor: Integer; // цвет тени
       
ShadowLeft: Integer; // сдвиг тени относитьльно текста вправо
       
ShadowTop: Integer; // сдвиг тени относитьльно текста вниз
       
TextColor: Integer; // цвет текста
       
TextLeft: Integer; // расположение картинки слева
       
TextTop: Integer; // расположение картинки сверху
       
Text: String; // сам ткст
   
end;


procedure iColorRect(Canvas: TCanvas; const Color, Width, Height: Integer);  /// private proc
var
   
rt: TRect;
begin
   
rt.Left := 0;
    rt.Top := 0;
    rt.Right := Width;
    rt.Bottom := Height;
    Canvas.Brush.Color := Color;
    Canvas.FillRect(rt);
end;


function CreateBitmapShadowText(const st: _SHADOW_TEXT_STRUCT): TBitmapImage;
var
   
UndefWidth, UndefHeight: Integer;
begin
   
Result := TBitmapImage.Create( TComponent(st.Parent) ); // создаём картинку с указанием принадлежности
   
with Result do
    begin
       
Parent := st.Parent; // назначаем родителя

       
with Bitmap.Canvas do
        try
// устанавливаем методам канвы спецификации шрифта чтоб чуть дальше методами канвы TextWidth и TextHeight получить требуемые размеры для отображения теста
           
Font.Color := st.ShadowColor;
            Font.Size := st.FontSize;
            Font.Name := st.FontName;
            Font.Style := st.FontStyle;
        finally  // пишем значения размера текста в переменные, чтоб не гонять 2 раза методы TextWidth и TextHeight
           
UndefWidth := st.ShadowLeft + TextWidth(st.Text);
            UndefHeight := st.ShadowTop + TextHeight(st.Text);
        end;

        SetBounds( ScaleX(st.TextLeft), ScaleY(st.TextTop), ScaleX(UndefWidth), ScaleY(UndefHeight) ); // устанвливаем размеры картинки

        /// устанавливаем размеры подклассу картинки - битмапу
       
Bitmap.Width := ScaleX(UndefWidth);
        Bitmap.Height := ScaleY(UndefHeight);

        // запоняем весь битмап картинки цветом фона
       
iColorRect(Bitmap.Canvas, st.BackgroundColor, Width, Height);
        // утанавливаем прозрачность канве
       
SetBKMode(Bitmap.Canvas.Handle, TRANSPARENT);

        with Bitmap.Canvas do
        begin
           
TextOut(0 + st.ShadowLeft, 0 + st.ShadowTop, st.Text); // рисуем текст-тень
           
Font.Color := st.TextColor; // меняем цвет шрифта
           
TextOut(0, 0, st.Text); // рисуем поверх тени тектс
       
end;
    end;
end;



procedure InitializeWizard();
var
   
sts: _SHADOW_TEXT_STRUCT;
    BitmapImage: TBitmapImage;
begin
   
sts.Parent := WizardForm.SelectDirPage;
    sts.BackgroundColor := WizardForm.SelectDirPage.Color;
    sts.FontStyle := [fsBold];
    sts.FontSize := 44;
    sts.FontName := 'Tahoma';
    sts.ShadowColor := clBlack;
    sts.ShadowLeft := 2;
    sts.ShadowTop := 2;
    sts.TextColor := clYellow;
    sts.TextLeft := 10;
    sts.TextTop := 100;
    sts.Text := 'Valve';

    BitmapImage := CreateBitmapShadowText(sts);
end;



2-пример создания текста с обводкой:
читать дальше »
Код:

const
   
TRANSPARENT = 1;
    STEAM_GREEN = $506a5a;

type
   
HDC = LongWord;

function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';

type
   
_BORDER_TEXT_STRUCT = record
       
Parent: TWinControl; // родитель картинки
       
BackgroundColor: Integer; // цвет фона (катника получится прямоугольной. Поэтому всё, что в пределах прямоугольника, можно закрасить этим цветом перед тем как туда врисуется текст)
       
FontStyle: TFontStyles; // стиль шрафта (если ничего не приваивать, то будет стиль по-умолчанию)
       
FontSize: Integer; // размер шрифта (если ничего не приваивать, то будет размер шрифта по-умолчанию)
       
FontName: String; // имя шрифта (если ничего не приваивать (не рекомендую), то будет имя шрифта по-умолчанию)
       
BorderColor: Integer; // цвет обводки
       
BorderWidth: Integer; // ширина обводки
       
TextColor: Integer; // цвет текста
       
TextLeft: Integer; // расположение картинки слева
       
TextTop: Integer; // расположение картинки сверху
       
Text: String; // сам ткст
   
end;


procedure iColorRect(Canvas: TCanvas; const Color, Width, Height: Integer);  /// private proc
var
   
rt: TRect;
begin
   
rt.Left := 0;
    rt.Top := 0;
    rt.Right := Width;
    rt.Bottom := Height;
    Canvas.Brush.Color := Color;
    Canvas.FillRect(rt);
end;


function CreateBitmapBorderText(const bt: _BORDER_TEXT_STRUCT): TBitmapImage;  // на выходе обычный TBitmapImage со всеми вытекающими возможностями
var
   
UndefWidth, UndefHeight: Integer;
begin
   
Result := TBitmapImage.Create( TComponent(bt.Parent) ); // создаём картинку с указанием принадлежности
   
with Result do
    begin
       
Parent := bt.Parent; // назначаем родителя

       
with Bitmap.Canvas do
        try
// устанавливаем методам канвы спецификации шрифта чтоб чуть дальше методами канвы TextWidth и TextHeight получить требуемые размеры для отображения теста
           
Font.Color := bt.BorderColor;
            Font.Size := bt.FontSize;
            Font.Name := bt.FontName;
            Font.Style := bt.FontStyle;
        finally  // пишем значения размера текста в переменные, чтоб не гонять 2 раза методы TextWidth и TextHeight
           
UndefWidth := TextWidth(bt.Text) + bt.BorderWidth*2;
            UndefHeight := TextHeight(bt.Text) + bt.BorderWidth*2;
        end;

        SetBounds( ScaleX(bt.TextLeft+ bt.BorderWidth), ScaleY(bt.TextTop), ScaleX(UndefWidth), ScaleY(UndefHeight) ); // устанвливаем размеры картинки

        /// устанавливаем размеры подклассу картинки - битмапу
       
Bitmap.Width := ScaleX(UndefWidth);
        Bitmap.Height := ScaleY(UndefHeight);

        // запоняем весь битмап картинки цветом фона
       
iColorRect(Bitmap.Canvas, bt.BackgroundColor, Width, Height);
        // утанавливаем прозрачность канве
       
SetBKMode(Bitmap.Canvas.Handle, TRANSPARENT);

        with Bitmap.Canvas do
        begin
           
// рисуем обводку
           
TextOut(bt.BorderWidth*2, bt.BorderWidth*2, bt.Text);
            TextOut(0, 0, bt.Text);
            TextOut(bt.BorderWidth*2, 0, bt.Text);
            TextOut(0, bt.BorderWidth*2, bt.Text);
           
            Font.Color := bt.TextColor; // меняем цвет шрифта
           
TextOut(bt.BorderWidth, bt.BorderWidth, bt.Text); // рисуем поверх тени тектс
       
end;
    end;
end;



procedure InitializeWizard();
var
   
bts: _BORDER_TEXT_STRUCT;
    BitmapImage: TBitmapImage;
begin
   
bts.Parent := WizardForm.SelectDirPage;
    bts.BackgroundColor := WizardForm.SelectDirPage.Color;
    bts.FontStyle := [];
    bts.FontSize := 44;
    bts.FontName := 'Tahoma';
    bts.BorderColor := clBlack;
    bts.BorderWidth := 1;
    bts.TextColor := STEAM_GREEN;
    bts.TextLeft := 10;
    bts.TextTop := 100;
    bts.Text := 'Valve';

    BitmapImage := CreateBitmapBorderText(bts);
end;



Внимание всем! Данный пример нужно использовать только в том случае, если у класса на котором хотите рисовать нет подкласса TCanvas, в противном случае лучше использвать пред. пример, тк он быстрее(хотя на глаз не видно:)). Хотя и у этого примера есть свой плюс - картинка на выходе.

==================================== UPD
разъединил предыдущий пример:

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

const
   
TRANSPARENT = 1;

    STEAM_GREEN = $506a5a;


type
   
HDC = LongWord;

    _LITTLE_FONT_INFO = record
     
Style: TFontStyles;
      Size: Integer;
      Name: String;
    end;


function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';


procedure CreateTextWithShadow(Canvas: TCanvas; const Text: String; const FontInfo: _LITTLE_FONT_INFO; const TextLeft, TextTop, TextColor, ShadowColor, ShadowLeft, ShadowTop: Integer);
begin
    with
Canvas do
    begin
       
Font.Color := ShadowColor;
        Font.Size := FontInfo.Size;
        Font.Name := FontInfo.Name;
        Font.Style := FontInfo.Style;
        TextOut(TextLeft + ShadowLeft, TextTop + ShadowTop, Text);
        Font.Color := TextColor;
        TextOut(TextLeft, TextTop, Text);
    end;
end;


procedure WizardFormOnPaint(Sender: TObject);
var
   
lfi: _LITTLE_FONT_INFO;
begin
   
SetBKMode(TWizardForm(Sender).Canvas.Handle, TRANSPARENT);

    lfi.Style := [];
    lfi.Size := 24;
    lfi.Name := 'Arial';
    CreateTextWithShadow(TWizardForm(Sender).Canvas, 'VALVE', lfi, ScaleX(127), ScaleY(77), clWhite, clBlack, 4, 3);
end;


procedure InitializeWizard();
begin
   
WizardForm.Color := STEAM_GREEN;
    WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;



с обводкой:
читать дальше »
Код:

const
   
TRANSPARENT = 1;

    STEAM_GREEN = $506a5a;


type
   
HDC = LongWord;

    _LITTLE_FONT_INFO = record
     
Style: TFontStyles;
      Size: Integer;
      Name: String;
    end;


function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';


procedure CreateTextWithBorder(Canvas: TCanvas; const Text: String; const FontInfo: _LITTLE_FONT_INFO; const TextLeft, TextTop, TextColor, ShadowColor, BorderWidth: Integer);
begin
    with
Canvas do
    begin
       
Font.Color := ShadowColor;
        Font.Size := FontInfo.Size;
        Font.Name := FontInfo.Name;
        Font.Style := FontInfo.Style;
        TextOut(TextLeft + BorderWidth, TextTop + BorderWidth, Text);
        TextOut(TextLeft - BorderWidth, TextTop - BorderWidth, Text);
        TextOut(TextLeft + BorderWidth, TextTop - BorderWidth, Text);
        TextOut(TextLeft - BorderWidth, TextTop + BorderWidth, Text);
        Canvas.Font.Color := TextColor;
        TextOut(TextLeft, TextTop, Text);
    end;
end;


procedure WizardFormOnPaint(Sender: TObject);
var
   
lfi: _LITTLE_FONT_INFO;
begin
   
SetBKMode(TWizardForm(Sender).Canvas.Handle, TRANSPARENT);

    lfi.Style := [fsBold];
    lfi.Size := 54;
    lfi.Name := 'Tahoma';
    CreateTextWithBorder(TWizardForm(Sender).Canvas, 'VALVE', lfi, ScaleX(16), ScaleY(16), clBlack, clWhite, 1);
end;


procedure InitializeWizard();
begin
   
WizardForm.Color := STEAM_GREEN;
    WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;




прямоугольник:
читать дальше »
Код:

const
   
STEAM_GREEN = $506a5a;


type
   
HDC = LongWord;


function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';


procedure CreateSquare(Canvas: TCanvas; const Left, Top, Width, Height, BorderWidth, BorderColor: Integer);
begin
    with
Canvas do
    begin
       
Pen.Color := BorderColor;
        Pen.Width := BorderWidth;
        MoveTo(Left, Top);
        LineTo(Left, Top + Height);
        LineTo(Left + Width, Top + Height);
        LineTo(Left + Width, Top);
        LineTo(Top, Left);
    end;
end;


procedure WizardFormOnPaint(Sender: TObject);
begin
   
CreateSquare(TWizardForm(Sender).Canvas, ScaleX(5), ScaleY(5), ScaleX(300), ScaleY(120), 1, clWhite);
end;


procedure InitializeWizard();
begin
   
WizardForm.Color := STEAM_GREEN;
    WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;


Tima182 28-05-2013 12:32 2157637

Прошу помогите , хочу создать инсталл для игры, сделал разбивку на тома, а оно максимум может 2гига что ли, а бин должен весит как минимум 3-4гиг, помогите сделать что бы бин весит максимально возможное у игры и не было 2-3 бин файлов?
читать дальше »
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Grand Theft Auto - San Andreas - Upgrade"
#define MyAppVersion "2.1"
#define MyAppExeName "gta_sa.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={{4B6ED6F4-DD38-45F0-9F8D-A07C39F8AA69}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName=C:\Games\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputDir=C:\Users\Тима\Desktop
OutputBaseFilename=Grand Theft Auto - San Andreas - Upgrade v2.1 (2012-Rus)
Compression=lzma/ultra
SolidCompression=true
DiskSpanning=true
DiskSliceSize=6000000000
PrivilegesRequired=none
DiskClusterSize=4096

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags:

unchecked

[Files]
Source: D:\Игры\Games\Grand Theft Auto - San Andreas - Upgrade v2.1 (2012-Rus)\gta_sa.exe; DestDir: {app};

Flags: ignoreversion
Source: D:\Игры\Games\Grand Theft Auto - San Andreas - Upgrade v2.1 (2012-Rus)\*; DestDir: {app}; Flags:

ignoreversion recursesubdirs createallsubdirs
; 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

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags:

nowait postinstall skipifsilent


Gnom_aka_Lexander 28-05-2013 12:45 2157645

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

Gnom_aka_Lexander 28-05-2013 13:16 2157676

Цитата:

Цитата Tima182
Кстати предел у инносетуп сколько байт? »

Из справки:
Цитата:

DiskSliceSize
Возможные значения:
от 262144 до 2100000000, или max
Значение по умолчанию:
max (2100000000)
Цитата:

Цитата Tima182
а бинарник сжат другим способом?»

берешь любой архиватор, изучаешь в справке способы распаковки. к некоторым даже есть исходные коды кастомных распаковщиков ( 7Z, FreeArc). Или берещь готовую библиотеку ISDone - в ней реализована распаковка основных архиваторов, удобное управление распаковкой, к библиотеке идет минимальный пример, в котором расписаны все основные возможности и наиподробнейшая справка, которая не оставляет ни одного вопроса без ответа. И если ты ломаешь голову, как сделать, чтоб например *.7z стало *.bin, то не стоит тебе заниматься даже таким программированием, как создание инсталляторов.

insombia 28-05-2013 20:06 2158009

Tima182 http://krinkels.org/forumdisplay.php?f=141 изучай

alexparser 29-05-2013 19:48 2158739

При запуске инсталлятора на Win XP RUS вылетает ошибка - 'Cannot Import dll:C:\DOCUME~\Owner\LOCALS~1\Temp\is-8DNAR.tmp\mylib.dll'
На англоязычных осях все в порядке.
Inno Setup 5.5.2(a) не юникодовый.

В чем может быть проблема?

habib2302 31-05-2013 17:18 2159985

доброе время суток.помогите мне объединить 2 скрипта

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

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

const
///////////////////////////////////Относится к лого и изображениям мастера
  RT_RCDATA            = 10;

///////////////////////////////////Удаление других приложений при старте
  APPID_AIDA_EXTREME    = 'AIDA64 Extreme Edition';
  APPID_AIDA_BUISNES    = 'AIDA64 Business Edition';

  WAIT_OBJECT_0 = $0;
  STARTF_USESHOWWINDOW  = 1;
  NORMAL_PRIORITY_CLASS = $00000020;
  INFINITE              = $FFFFFFFF;

type

///////////////////////////////////Удаление других приложений при старте
  _STARTUPINFO = record
  cb: DWORD;
  #ifdef UNICODE
    lpReserved, lpDesktop, lpTitle: PAnsiChar;
  #else
    lpReserved, lpDesktop, lpTitle: PChar;
  #endif
  dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
  wShowWindow, cbReserved2: Word;
  lpReserved2: Byte;
  hStdInput, hStdOutput, hStdError: THandle;
  end;

  _PROCESS_INFORMATION = record
  hProcess: THandle;
  hThread: THandle;
  dwProcessId: DWORD;
  dwThreadId: DWORD;
  end;
//////////////////////////////

///////////////////////////////////Удаление других приложений при старте
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif
///////////////////////////////
var
///////////////////////////////////Дерево выбора папок
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
///////////////////////////////////Лого и изображения
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
///////////////////////////////////////////
 CheckLicense: TCheckBox;
 iInitialize: Boolean;
///////////////////////////////////WinTB
 TB: TTrackBar;
///////////////////////////////

///////////////////////////////////Удаление других приложений при старте
function GetUninstallPath(const AppIds: array of String): array of String;
var
  StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for i := 0 to GetArrayLength(AppIds)-1 do
  begin
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
      Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;


///////////////////////////////////Удаление других приложений при старте
procedure UninstallApps(const UninstallPathes: array of String);
var
  pi: _PROCESS_INFORMATION;
  si: _STARTUPINFO;
  i: Integer;
begin
  for i := 0 to GetArrayLength(UninstallPathes)-1 do
  begin
    si.cb := SizeOf(si);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := SW_SHOWNORMAL;
    #ifdef UNICODE
      if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #else
      if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #endif
    begin
      MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
      Exit;
    end;
    try
      while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
    finally
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    end;
  end;
end;
//////////////////////////////////////////

function MessageBox(hWnd: Integer; lpText, lpCaption: PAnsiChar; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

procedure TBOnChange(Sender: TObject);
begin
  SetTaskBarProgressValue(WizardForm.Handle, TTrackBar(sender).Position);
end;

///////////////////////////////////Ресурсы(относится к лого и изображениям мастера)
function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
  lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

function InitializeSetup:boolean;

///////////////////////////////////Удаление других приложений при старте
var
  i, Len: Integer;
  uArray: array of String;
begin
  uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES] );
  Len := GetArrayLength(uArray);
  Result := Len = 0;
  if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  begin
    UninstallApps(uArray);
    Result := InitializeSetup();
  end;
/////////////////////////////////////
end;

///////////////////////////////////Обработчик чекбокса лицензионного соглашения
procedure LicenseOnClick(Sender: TObject);
begin
  case TCheckBox(Sender).Checked of
    True: WizardForm.LicenseAcceptedRadio.Checked := True;
    False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;
//////////////////////////

///////////////////////////////////Дерево выбора папки установки
procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#AIDA641}'
else
if IsComponentSelected('AIDA642') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#AIDA642}';
end;
////////////////////////////////

///////////////////////////////////Дерево выбора папки программ
procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#AIDA641}'
else
if IsComponentSelected('AIDA642') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#AIDA642}';
end;
//////////////////

///////////////////////////////////Смена страниц местами
function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;
//////////////////

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  WizardForm.TypesCombo.hide;

///////////////////////////////////Смена страниц местами
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
/////////////////
  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;
  with WizardForm do
  begin

///////////////////////////////////Логотип и изображения мастера
    iInitialize := True;
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
///////////////////////////////////Изображения
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);
////////////////////////////////////////////

///////////////////////////////////Логотип

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;
///////////////////////////////////

///////////////////////////////////WinTB
    WizardForm.Position:=poScreenCenter;
    WizardForm.BorderIcons:=[biSystemMenu];
    ExtractTemporaryFile('WinTB.dll');
    TaskBarV11(WizardForm.Handle);
    TB:=TTrackBar.Create(Wizardform)
//////////////////////////////////////

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

///////////////////////////////////WinTB
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=false; Cancel:=false;
  WizardForm.ProgressGauge.State:=npbsPaused;
  case MessageBox(WizardForm.Handle, SetupMessage(msgExitSetupMessage), SetupMessage(msgExitSetupTitle), MB_YESNO or MB_DEFBUTTON2 or MB_ICONINFORMATION) of
    IDYES: Cancel:=true;
    IDNO: begin WizardForm.BringToFront; WizardForm.ProgressGauge.State:=npbsNormal; end;
  end;
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]
//////////////////////////////////////////////////////

///////////////////////////////////Смена папки установки в зависимости от компонента

  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end;
  end;
///////////////////////////////////////////////////////

  wpSelectTasks:
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  if iInitialize then
  begin
    gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
///////////////////////////////////Логотип и изображения мастера
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
///////////////////////////////////Изображения
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

///////////////////////////////////Логотип
        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;

Код:

[.....code]
#include "WinTB.iss"

function MessageBox(hWnd: Integer; lpText, lpCaption: PAnsiChar; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

procedure TBOnChange(Sender: TObject);
begin
  SetTaskBarProgressValue(WizardForm.Handle, TTrackBar(sender).Position);
end;

procedure InitializeWizard();  var TB: TTrackBar;
begin
  WizardForm.Position:=poScreenCenter;
  WizardForm.BorderIcons:=[biSystemMenu];
  ExtractTemporaryFile('WinTB.dll');
  TaskBarV11(WizardForm.Handle);
  TB:=TTrackBar.Create(Wizardform)
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=false; Cancel:=false;
  WizardForm.ProgressGauge.State:=npbsPaused;
  case MessageBox(WizardForm.Handle, SetupMessage(msgExitSetupMessage), SetupMessage(msgExitSetupTitle), MB_YESNO or MB_DEFBUTTON2 or MB_ICONINFORMATION) of
    IDYES: Cancel:=true;
    IDNO: begin WizardForm.BringToFront; WizardForm.ProgressGauge.State:=npbsNormal; end;
  end;
end;

procedure DeinitializeSetup();
begin
  TaskBarDestroy;
end;


просто после объединения и компилирования вот что у меня получается

insombia 31-05-2013 19:26 2160050

habib2302 с файлами кидай

valyok666 31-05-2013 19:48 2160065

Цитата:

Цитата habib2302
доброе время суток.помогите мне объединить 2 скрипта
читать дальше »
просто после объединения и компилирования вот что у меня получается »

Кидай свой скрипт с файлами)запакуй в архив,залей на ргхост,ссылку сюда кинь)

Цитата:

Цитата alexparser
При запуске инсталлятора на Win XP RUS вылетает ошибка - 'Cannot Import dll:C:\DOCUME~\Owner\LOCALS~1\Temp\is-8DNAR.tmp\mylib.dll'
На англоязычных осях все в порядке.
Inno Setup 5.5.2(a) не юникодовый.
В чем может быть проблема? »

переведи ошибку)библиотеку не может найди значит в винде нехватает её

insombia 31-05-2013 20:16 2160085

habib2302 пробуй http://rghost.ru/46409287

habib2302 31-05-2013 20:19 2160088

insombia, AIDA64
Код:

[.....code]
#include "WinTB.iss"

function MessageBox(hWnd: Integer; lpText, lpCaption: PAnsiChar; uType: Cardinal): Integer;
  external 'MessageBoxA@user32.dll stdcall';

procedure TBOnChange(Sender: TObject);
begin
  SetTaskBarProgressValue(WizardForm.Handle, TTrackBar(sender).Position);
end;

procedure InitializeWizard();  var TB: TTrackBar;
begin
  WizardForm.Position:=poScreenCenter;
  WizardForm.BorderIcons:=[biSystemMenu];
  ExtractTemporaryFile('WinTB.dll');
  TaskBarV11(WizardForm.Handle);
  TB:=TTrackBar.Create(Wizardform)
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=false; Cancel:=false;
  WizardForm.ProgressGauge.State:=npbsPaused;
  case MessageBox(WizardForm.Handle, SetupMessage(msgExitSetupMessage), SetupMessage(msgExitSetupTitle), MB_YESNO or MB_DEFBUTTON2 or MB_ICONINFORMATION) of
    IDYES: Cancel:=true;
    IDNO: begin WizardForm.BringToFront; WizardForm.ProgressGauge.State:=npbsNormal; end;
  end;
end;

procedure DeinitializeSetup();
begin
  TaskBarDestroy;
end;


insombia 31-05-2013 20:22 2160090

habib2302 это уже по примеру сделаешь,это не сложно

saurn 31-05-2013 21:23 2160123

habib2302, а чего там было сложного?
Скрипт
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2454 Beta"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Extreme Engineer Edition"
#define AIDA643 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"
#define AIDA64EXE3 "aida64.exe"
#define AuthRep "Xabib"
#include "botva2.iss"

#include "WinTB.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\FinalWire
DefaultGroupName=FinalWire
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
InfoBeforeFile=info.rtf
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppCopyright={#AuthRep}
AppVerName={#MyAppVersion}
UninstallDisplayName={#MyAppName}
AppModifyPath={app}
VersionInfoTextVersion={#MyAppVersion}
VersionInfoProductName={#MyAppName}
DirExistsWarning=no
AppendDefaultDirName=no
AppendDefaultGroupName=no
LicenseFile=license.txt
DisableReadyPage=yes
AppId=TheBestAidaInstallEver

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

[Components]
Name: AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA642; Description: {#AIDA642}; Flags: exclusive;
Name: AIDA643; Description: {#AIDA643}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;
Name: icons\quicklaunchicon7; Description: "В Панели Задач"; MinVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: info.rtf; DestDir: {app}; Flags: ignoreversion
Source: license.txt; DestDir: {app}; Flags: ignoreversion
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: PinToTasckbar.vbs; DestDir: {tmp}; Flags: deleteafterinstall
Source: {app}\{#AIDA641}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA641;
Source: {app}\{#AIDA642}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA642;
Source: {app}\{#AIDA643}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: AIDA643;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Components: AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Components: AIDA642;
Name: {group}\{#AIDA643}; Filename: {app}\{#AIDA64EXE3}; Components: AIDA643;
Name: {group}\{cm:UninstallProgram,{#AIDA641}}; Filename: {uninstallexe}; Components: AIDA641;
Name: {group}\{cm:UninstallProgram,{#AIDA642}}; Filename: {uninstallexe}; Components: AIDA642;
Name: {group}\{cm:UninstallProgram,{#AIDA643}}; Filename: {uninstallexe}; Components: AIDA643;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA641;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA642;
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}; Components: AIDA643;
Name: {group}\Справка {#AIDA641}; Filename: {app}\aida64.chm; Components: AIDA641;
Name: {group}\Справка {#AIDA642}; Filename: {app}\aida64.chm; Components: AIDA642;
Name: {group}\Справка {#AIDA643}; Filename: {app}\aida64.chm; Components: AIDA643;
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA642;
Name: {commondesktop}\{#AIDA643}; Filename: {app}\{#AIDA64EXE3}; Tasks: icons\desktop; Components: AIDA643;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA643}; Filename: {app}\{#AIDA64EXE3}; Tasks: icons\quicklaunchicon; Components: AIDA643;

[Run]
Filename: {app}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA641;
Filename: {tmp}\PinToTasckbar.vbs; Parameters: """{app}\{#AIDA64EXE1}"""; Flags: shellexec; Tasks: icons\quicklaunchicon7; Components: AIDA641;
Filename: {app}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA642;
Filename: {tmp}\PinToTasckbar.vbs; Parameters: """{app}\{#AIDA64EXE2}"""; Flags: shellexec; Tasks: icons\quicklaunchicon7; Components: AIDA642;
Filename: {app}\{#AIDA64EXE3}; Description: "{cm:LaunchProgram,{#StringChange(AIDA643, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA643;
Filename: {tmp}\PinToTasckbar.vbs; Parameters: """{app}\{#AIDA64EXE3}"""; Flags: shellexec; Tasks: icons\quicklaunchicon7; Components: AIDA643;

[Messages]
BeveledLabel=RePack by {#AuthRep}

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

const
  RT_RCDATA            = 10;
  APPID_AIDA_EXTREME    = 'AIDA64 Extreme Edition';
  APPID_AIDA_ENGINEER    = 'AIDA64 Extreme Engineer Edition';
  APPID_AIDA_BUISNES    = 'AIDA64 Business Edition';

  WAIT_OBJECT_0 = $0;
  STARTF_USESHOWWINDOW  = 1;
  NORMAL_PRIORITY_CLASS = $00000020;
  INFINITE              = $FFFFFFFF;

type
  _STARTUPINFO = record
  cb: DWORD;
  #ifdef UNICODE
    lpReserved, lpDesktop, lpTitle: PAnsiChar;
  #else
    lpReserved, lpDesktop, lpTitle: PChar;
  #endif
  dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
  wShowWindow, cbReserved2: Word;
  lpReserved2: Byte;
  hStdInput, hStdOutput, hStdError: THandle;
  end;

  _PROCESS_INFORMATION = record
  hProcess: THandle;
  hThread: THandle;
  dwProcessId: DWORD;
  dwThreadId: DWORD;
  end;

function MessageBox(hWnd: Integer; lpText, lpCaption: PAnsiChar; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif

var
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
 CheckLicense: TCheckBox;
 iInitialize: Boolean;


function GetUninstallPath(const AppIds: array of String): array of String;
var
  StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for i := 0 to GetArrayLength(AppIds)-1 do
  begin
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
      Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;

procedure UninstallApps(const UninstallPathes: array of String);
var
  pi: _PROCESS_INFORMATION;
  si: _STARTUPINFO;
  i: Integer;
begin
  for i := 0 to GetArrayLength(UninstallPathes)-1 do
  begin
    si.cb := SizeOf(si);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := SW_SHOWNORMAL;
    #ifdef UNICODE
      if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #else
      if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #endif
    begin
      MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
      Exit;
    end;
    try
      while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
    finally
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    end;
  end;
end;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
  lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

function InitializeSetup:boolean;
var
  i, Len: Integer;
  uArray: array of String;
begin
  uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES, APPID_AIDA_ENGINEER] );
  Len := GetArrayLength(uArray);
  Result := Len = 0;
  if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  begin
    UninstallApps(uArray);
    Result := InitializeSetup();
  end;
end;

procedure TBOnChange(Sender: TObject);
begin
  SetTaskBarProgressValue(WizardForm.Handle, TTrackBar(sender).Position);
end;

procedure LicenseOnClick(Sender: TObject);
begin
  case TCheckBox(Sender).Checked of
    True: WizardForm.LicenseAcceptedRadio.Checked := True;
    False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
if IsComponentSelected('AIDA643') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'';
end;

procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('AIDA641') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+''
else
if IsComponentSelected('AIDA642') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
if IsComponentSelected('AIDA643') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'';
end;

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure RedesignWizardForm;
begin
  WizardForm.Position:=poScreenCenter;
  WizardForm.BorderIcons:=[biSystemMenu];
  with WizardForm.ComponentsList do
  begin
    Top := ScaleY(50);
    Height := ScaleY(155);
  end;
end;

procedure InitializeWizard;
var
  TB: TTrackBar;
begin
  RedesignWizardForm;
  WizardForm.TypesCombo.hide;
  PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage;
  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;
  with WizardForm do
  begin
    iInitialize := True;
    ExtractTemporaryFile('WinTB.dll');
    TaskBarV11(WizardForm.Handle);
    TB:=TTrackBar.Create(Wizardform)
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
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]
  if IsComponentSelected('AIDA641') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA641}';
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA641}';
  end else
  if IsComponentSelected('AIDA642') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA642}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA642}'
  end else
  if IsComponentSelected('AIDA643') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}')) + '{#AIDA643}'
    WizardForm.GroupEdit.Text := AddBackslash(ExpandConstant('{#SetupSetting("DefaultGroupName")}')) + '{#AIDA643}'
  end;
  end;
  wpSelectTasks:
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=false; Cancel:=false;
  WizardForm.ProgressGauge.State:=npbsPaused;
  case MessageBox(WizardForm.Handle, SetupMessage(msgExitSetupMessage), SetupMessage(msgExitSetupTitle), MB_YESNO or MB_DEFBUTTON2 or MB_ICONINFORMATION) of
    IDYES: Cancel:=true;
    IDNO: begin WizardForm.BringToFront; WizardForm.ProgressGauge.State:=npbsNormal; end;
  end;
end;

procedure DeinitializeSetup();
begin
  if iInitialize then
  begin
    gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;


P.S. Скрипт можно немножко причесать, в частности, извлечение ресурсов. Но это уже сами.
Цитата:

Цитата alexparser
При запуске инсталлятора на Win XP RUS вылетает ошибка - 'Cannot Import dll:C:\DOCUME~\Owner\LOCALS~1\Temp\is-8DNAR.tmp\mylib.dll' »

На скрипт бы глянуть.

insombia 01-06-2013 10:29 2160294

habib2302 значит ты криво сводишь,или что-то в скрипте скрывает те каринки

saurn 01-06-2013 10:53 2160302

habib2302, я скрипт, двумя постами выше, для кого выложил? Это полностью сведенный скрипт, из кусков, что вы сами и дали, и проверенный, соответственно.

insombia 01-06-2013 13:55 2160367

блин,помогите прикрутить через ботву лого прозрачное (в ботве не шарю) http://rghost.ru/46424176

Johny777 01-06-2013 15:30 2160402

insombia,
Пример:

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

#include "botva2.iss"

[Setup]
AppName=botva2 by South.Tver
AppVerName=botva2 by South.Tver
DefaultDirName={pf}\botva2 by South.Tver
OutputBaseFilename=setup

[Files]
Source: botva2.dll; Flags: dontcopy
Source: Valve.png; Flags: dontcopy

[Code]
procedure InitializeWizard;
begin
   
ExtractTemporaryFile('Valve.png')
    ExtractTemporaryFile('botva2.dll');
   
    ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\Valve.png'), ScaleX(0), ScaleY(316), 0, 0, False, False);
    ImgApplyChanges(WizardForm.Handle);
end;

procedure DeinitializeSetup();
begin
   
gdipShutdown();
end;


описание входных аргументов читай в модуле (внешней библиотеке) botva2.iss
чтобы из скрипта-примера перейти к прототипу импортируемой функции держи зажатым Ctrl и левой кнопкой мыши нажми на имя используемой функции

insombia 01-06-2013 15:57 2160417

Johny777 на юникоде когда добавляю в DeinitializeSetup часть кода,инсталл после закрытия вылетает
p.s. а можно сделать ссылку кликабельной на png?

habib2302 01-06-2013 16:24 2160425

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

insombia 01-06-2013 23:22 2160594

замечал что скиммер ( на англ не помню ник) в репаках делает фичу,которая увеличивает время установки,но это вроде не приоритет,что оно такое?

nik1967 02-06-2013 08:42 2160655

insombia, у Skymmer'а фича та зовётся сильным сжатием.

insombia 02-06-2013 09:26 2160659

кто-то может наглядно показать как юзать в исдоне isexec через тим вивер?

insombia 02-06-2013 22:50 2161061

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

habib2302 03-06-2013 11:23 2161275

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

можно сделать в is тип установки:установка и распаковка?

sergey3695 03-06-2013 16:09 2161467

Цитата:

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

каким образом? изображение можно поменять на кнопках с помощью SkinBuilder.
если ты хочешь через ботву то только так
читать дальше »
Код:

#include "botva2.iss"

#define FormPic "form.png"
#define CloseBtnPic "closebtn.png"
#define MinimizeBtnPic "minimizebtn.png"

[Setup]
AppName=Temp
AppVerName=Temp
DefaultDirName={pf}\Temp
VersionInfoCopyright=VoLT

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

[Files]
Source: InstallFiles\*; DestDir: {tmp}; Flags: dontcopy sortfilesbyextension

[_code]
var
WizardImg: Longint;
hCloseBtn, hMinimizeBtn, MusicButton,
hCancelBtn, hNextBtn, hBackBtn, hDirBrowseBtn, hGroupBrowseBtn, hCancelUninstBtn: HWND;

function SetWindowLong(hWnd: Longint; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetLayeredWindowAttributes(hWnd : Longint; crKey : TColor; bAlpha : byte; dwFlags : DWORD): BOOL; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';

procedure CloseBtnClick(hBtn:HWND);
begin
WizardForm.Close;
end;

procedure MinimizeBtnClick(hBtn:HWND);
begin
SendMessage(WizardForm.Handle,$0112,61472,0);
end;

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

//************************************************ [Начало - Вставка изображений] ***************************************************//

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\innocallback.dll')) then ExtractTemporaryFile('innocallback.dll');
Result:=True;
end;

procedure CreateWizardImage;
begin
with WizardForm do begin
BorderStyle:=bsNone;
Bevel.Hide;
InnerNotebook.Hide;
OuterNotebook.Hide;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(600), ScaleY(490));
Position:=poScreenCenter;
end;

with TLabel.Create(WizardForm) do begin
Parent:=WizardForm;
AutoSize:=False;
SetBounds(ScaleX(70), ScaleY(7), ScaleX(370), ScaleY(16));
Font.Name:= 'Georgia';
Font.Size:= 9;
Transparent:=True;
Font.Color:=$FFFFFF;
Font.Style:=[fsBold, fsItalic];
OnMouseDown:=@LabelOnMouseDown;
Caption:=WizardForm.Caption;
end;

ExtractTemporaryFile('{#FormPic}');
ExtractTemporaryFile('{#CloseBtnPic}');
ExtractTemporaryFile('{#MinimizeBtnPic}');
ExtractTemporaryFile('button.png');

WizardImg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}')+'\{#FormPic}',0,0,0,0,False,True);

ImgApplyChanges(WizardForm.Handle);

SetWindowLong(WizardForm.Handle,-20,GetWindowLong(WizardForm.Handle,-20) or $80000);
SetLayeredWindowAttributes(WizardForm.Handle,$00FF00,0,1);
end;

//************************************************ [Конец - Вставка изображений] ***************************************************//

//************************************************ [Начало - Текстуры кнопок] ***************************************************//

procedure SetStateNewButtons;
begin
with WizardForm.BackButton do begin
BtnSetText(hBackBtn,PAnsiChar(Caption));
BtnSetVisibility(hBackBtn,Visible);
BtnSetEnabled(hBackBtn,Enabled);
end;
with WizardForm.NextButton do begin
BtnSetText(hNextBtn,PAnsiChar(Caption));
BtnSetVisibility(hNextBtn,Visible);
BtnSetEnabled(hNextBtn,Enabled);
end;
with WizardForm.CancelButton do begin
BtnSetText(hCancelBtn,PAnsiChar(Caption));
BtnSetVisibility(hCancelBtn,Visible);
BtnSetEnabled(hCancelBtn,Enabled);
end;
BtnSetText(hDirBrowseBtn,PAnsiChar(WizardForm.DirBrowseButton.Caption));
BtnSetText(hGroupBrowseBtn,PAnsiChar(WizardForm.GroupBrowseButton.Caption));
end;

procedure WizardFormBtnClick(hBtn:HWND);
var
Btn:TButton;
begin
//sndPlaySound(ExpandConstant('{tmp}\Click.wav'),$0001);
case hBtn of
hCancelBtn: Btn:=WizardForm.CancelButton;
hNextBtn: Btn:=WizardForm.NextButton;
hBackBtn: Btn:=WizardForm.BackButton;
hDirBrowseBtn: Btn:=WizardForm.DirBrowseButton;
hGroupBrowseBtn: Btn:=WizardForm.GroupBrowseButton;
end;
Btn.OnClick(Btn);
SetStateNewButtons;
BtnRefresh(hBtn);
end;

procedure WFBtnEnter(hBtn:HWND);
begin
//sndPlaySound(ExpandConstant('{tmp}\WFEnter.wav'),$0001);
end;

procedure ButtonsTextures;
begin
//WFButtonFont:=TFont.Create;
//WFButtonFont.Style:=[fsBold];

with WizardForm.BackButton do begin
hBackBtn:=BtnCreate(WizardForm.Handle,225,400,90,90,ExpandConstant('{tmp}\button.png'),10,False);
BtnSetEvent(hBackBtn,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetEvent(hBackBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
//BtnSetFont(hBackBtn,WFButtonFont.Handle);
BtnSetFontColor(hBackBtn,$b6c4c5,$ffffff,$5d4e27,$B6B6B6);
BtnSetCursor(hBackBtn,GetSysCursorHandle(32649));
Width:=0;
Height:=0;
end;

with WizardForm.NextButton do begin
hNextBtn:=BtnCreate(WizardForm.Handle,320,400,90,90,ExpandConstant('{tmp}\button.png'),3,False);
BtnSetEvent(hNextBtn,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetEvent(hNextBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
//BtnSetFont(hNextBtn,WFButtonFont.Handle);
BtnSetFontColor(hNextBtn,$b6c4c5,$ffffff,$5d4e27,$B6B6B6);
BtnSetCursor(hNextBtn,GetSysCursorHandle(32649));
Width:=0;
Height:=0;
end;

with WizardForm.CancelButton do begin
hCancelBtn:=BtnCreate(WizardForm.Handle,430,400,90,90,ExpandConstant('{tmp}\button.png'),10,False);
BtnSetEvent(hCancelBtn,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetEvent(hCancelBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
//BtnSetFont(hCancelBtn,WFButtonFont.Handle);
BtnSetFontColor(hCancelBtn,$b6c4c5,$ffffff,$5d4e27,$B6B6B6);
BtnSetCursor(hCancelBtn,GetSysCursorHandle(32649));
Width:=0;
Height:=0;
end;

with WizardForm.DirBrowseButton do begin
hDirBrowseBtn:=BtnCreate(WizardForm.Handle,401,202,85,85,ExpandConstant('{tmp}\button.png'),10,False);
BtnSetEvent(hDirBrowseBtn,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetEvent(hDirBrowseBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
//BtnSetFont(hDirBrowseBtn,WFButtonFont.Handle);
BtnSetFontColor(hDirBrowseBtn,$b6c4c5,$ffffff,$5d4e27,$B6B6B6);
BtnSetCursor(hDirBrowseBtn,GetSysCursorHandle(32649));
Width:=0;
Height:=0;
end;

with WizardForm.GroupBrowseButton do begin
hGroupBrowseBtn:=BtnCreate(WizardForm.Handle,401,202,85,85,ExpandConstant('{tmp}\button.png'),10,False);
BtnSetEvent(hGroupBrowseBtn,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetEvent(hGroupBrowseBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
//BtnSetFont(hGroupBrowseBtn,WFButtonFont.Handle);
BtnSetFontColor(hGroupBrowseBtn,$b6c4c5,$ffffff,$5d4e27,$B6B6B6);
BtnSetCursor(hGroupBrowseBtn,GetSysCursorHandle(32649));
Width:=0;
Height:=0;
end;

hCloseBtn:=BtnCreate(WizardForm.Handle,516,35,16,16,ExpandConstant('{tmp}')+'\{#CloseBtnPic}',3,False);
BtnSetEvent(hCloseBtn,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetEvent(hCloseBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
BtnSetEvent(hCloseBtn,BtnClickEventID,WrapBtnCallback(@CloseBtnClick,1));
BtnSetCursor(hCloseBtn,GetSysCursorHandle(32649));

hMinimizeBtn:=BtnCreate(WizardForm.Handle,498,35,16,16,ExpandConstant('{tmp}')+'\{#MinimizeBtnPic}',3,False);
BtnSetEvent(hMinimizeBtn,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetEvent(hMinimizeBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
BtnSetEvent(hMinimizeBtn,BtnClickEventID,WrapBtnCallback(@MinimizeBtnClick,1));
BtnSetCursor(hMinimizeBtn,GetSysCursorHandle(32649));
end;

//************************************************ [Конец - Текстуры кнопок] ***************************************************//

procedure InitializeWizard;
begin
CreateWizardImage;
ButtonsTextures;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
SetStateNewButtons;
BtnSetVisibility(hDirBrowseBtn,False);
BtnSetVisibility(hGroupBrowseBtn,False);
ImgApplyChanges(WizardForm.Handle);
end;

procedure DeinitializeSetup;
begin
gdipShutdown;
end;


insombia 03-06-2013 16:39 2161485

типа как тут http://i5.pixs.ru/storage/8/5/4/Welc...96_3940854.png

insombia 03-06-2013 19:29 2161587

habib2302 не совсем понял вопрос

habib2302 03-06-2013 19:50 2161603

insombia, я хочу сделать чтобы инсталлятор устанавливал компоненты или распаковывал
вот скрин

insombia 03-06-2013 20:14 2161625

habib2302 ну такое я не знаю как сделать,так как в первые вижу
p.s. мне кажется или оно одно и тоже что установка что распаковка?

habib2302 03-06-2013 23:16 2161762

помогите мне убрать этот диалог

alert30 04-06-2013 06:11 2161855

Цитата:

Цитата insombia
распаковка »

Portable

habib2302 04-06-2013 16:49 2162136

мне кто нибудь ответит на мое сообщение????

Johny777 04-06-2013 22:11 2162361

habib2302, Сокрытие месседжбокса после удаления:

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

[code]
const
   
ID_QUESTION = 65579;

function InitializeUninstall(): Boolean;
var
   
ErrorCode: Integer;
begin
    if not
UninstallSilent then
    begin
       
Exec(ExpandConstant('{uninstallexe}'), '/SILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;
   
    if MsgBoxEx(0, FmtMessage(SetupMessage(msgConfirmUninstall), ['{#SetupSetting("AppName")}'] ), SetupMessage(msgUninstallAppTitle), MB_YESNO, ID_QUESTION, 0) = IDYES then Result := True;
end;


El Sanchez 04-06-2013 22:12 2162364

Цитата:

Цитата habib2302
мне кто нибудь ответит на мое сообщение???? »

habib2302, на основе примера из шапки:
Код:

const
   
WM_CLOSE = $0010;

function SetTimer(hWnd: HWND; nIDEvent: UINT_PTR; uElapse: UINT; lpTimerFunc: Longint): UINT_PTR; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT_PTR): BOOL; external 'KillTimer@user32.dll stdcall';

var
   
iTimer: UINT_PTR;

//////////////////////////////////////////////////////////////////////////////
procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
var
   
hWindow: HWND;
begin
   
hWindow := FindWindowByWindowName(FmtMessage(SetupMessage(msgUninstallAppFullTitle), ['{#SetupSetting("AppName")}']));
    if hWindow > 0 then
    begin
       
PostMessage(hWindow, WM_CLOSE, 0, 0);
        KillTimer(0, iTimer);
    end;
end;

////////////////////////////////////////////////////////////////////
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case
CurUninstallStep of
       
usPostUninstall: iTimer := SetTimer(0, 0, 50, CallbackAddr('TimerProc'));
    end;
end;


Robby 05-06-2013 12:02 2162655

Подскажите функцию поиска папки по маске или по имени.

Johny777 05-06-2013 12:23 2162682

Robby, по имени, с рекурсией:
читать дальше »
Код:

procedure SearchForFolder(const RootFolder, SearchFolderName: String; var ResultPathArray: array of String);
var
   
NewSearchPath: String;
    FindRec: TFindRec;
    Len: Integer;
begin
   
NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));

    if FindFirst(NewSearchPath + '*.*', FindRec) then
    try

        repeat
            if
(FindRec.Name <> '.') and (FindRec.Name <> '..') then
            if
FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
            begin
                if
FindRec.Name = SearchFolderName then
                begin
                   
Len := GetArrayLength(ResultPathArray);
                    SetArrayLength(ResultPathArray, Len+1);
                    ResultPathArray[Len] := NewSearchPath + FindRec.Name;
                end
                else
               
SearchForFolder(NewSearchPath + FindRec.Name, SearchFolderName, ResultPathArray);
            end;
        until not FindNext(FindRec);

    finally
       
FindClose(FindRec);
    end;
end;


procedure InitializeWizard();
var
   
AArray: array of String;
    i: Integer;
begin
   
SearchForFolder('C:\Program Files (x86)\CAPCOM', 'nativePC', AArray);
   
    for i := 0 to GetArrayLength(AArray)-1 do MsgBox(AArray[i], mbInformation, MB_OK);
end;
[/font]


по завершении входной массив содержит пути к папкам с искомым именем

audiofeel 07-06-2013 10:43 2163643

прошу протестировать простой установщик (отправил знакомому через файлообменник, не запускается пишет ошибка
"Divizion by zero
09:49:50
Runtime error
at 153:614
Invalid Opcode"
тут = http://file.sampo.ru/w287gd/

saurn 07-06-2013 11:33 2163668

audiofeel
читать дальше »
Погонял на 64-х разрядной семерке. Ошибок не замечено. Divizion by zero - нечто в скрипте делят на ноль, а это в свою очередь запрещено. Нужно смотреть во время отладки скрипта на той машине, где вылазиет ошибка.

Tco 03 07-06-2013 19:16 2164030

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

Johny777 07-06-2013 19:59 2164057

Tco 03, если правильно понял:

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

[Languages]
Name: "en"; MessagesFile: "compiler:Languages\English.isl"
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"


[code ]
procedure InitializeWizard();
begin
  case
ActiveLanguage() of
   
'en': MsgBox('English', mbInformation, MB_OK);
    'ru': MsgBox('Russian', mbInformation, MB_OK);
  end;
end;


audiofeel 07-06-2013 22:03 2164116

saurn,
Цитата:

Цитата saurn
Divizion by zero - нечто в скрипте делят на ноль, а это в свою очередь запрещено. »

может это говорить о здоровье системы на которой тестилось, насчет
Цитата:

Цитата saurn
Нужно смотреть во время отладки скрипта на той машине, где вылазиет ошибка. »

не выйдет у меня ни как

insombia 07-06-2013 23:42 2164171

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

insombia 08-06-2013 10:14 2164269

audiofeel а как ты в DirBrowseButton поменял обзор на изменить?

saurn 08-06-2013 11:17 2164290

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

[Messages]
;ButtonBrowse=Изменить...

procedure InitializeWizard();
begin
    {* WizardForm.DirBrowseButton.Caption := SetupMessage(msgButtonBrowse); *}
    WizardForm.DirBrowseButton.Caption := 'Изменить...';
end;


insombia 08-06-2013 12:54 2164330

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

saurn 08-06-2013 13:11 2164336

Цитата:

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

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

[Code]
const
    I_POS  = $F010;
    L_FL    = 0;


function GetSystemMenu(h_Wnd: HWND; b_Revert: Boolean): HWND;
    external 'GetSystemMenu@user32.dll stdcall';
function Remove_Menu(h_Wnd: HWND; i_Position: Integer; l_Flags: Longint): Boolean;
    external 'RemoveMenu@user32.dll stdcall';


procedure InitializeWizard();
begin
    Remove_Menu(GetSystemMenu(WizardForm.Handle, False), I_POS, L_FL);
end;


insombia 08-06-2013 13:16 2164340

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

Johny777 08-06-2013 14:09 2164367

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

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

const
   
UNIQUE_ID_EVENT = 777;
    INTERVAL = 1000;


type
   
TFNTimerProc = Integer;


function SetTimer(hWnd: HWND; nIDEvent: UINT_PTR; uElapse: UINT; lpTimerFunc: TFNTimerProc): UINT; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT_PTR): BOOL; external 'KillTimer@user32.dll stdcall';


procedure TimerCallBack(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
    if
WizardForm.Left <> Screen.Width - WizardForm.Width - 25 then WizardForm.Left := Screen.Width - WizardForm.Width - 25;
    if WizardForm.Top <> Screen.Height - WizardForm.Height - 75 then WizardForm.Top := Screen.Height - WizardForm.Height - 75;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
CurPageID of
       
wpInstalling: SetTimer(WizardForm.Handle, UNIQUE_ID_EVENT, INTERVAL, CallbackAddr('TimerCallBack'));

        wpFinished: KillTimer(WizardForm.Handle, UNIQUE_ID_EVENT);
    end;
end;


procedure DeinitializeSetup();
begin
   
KillTimer(WizardForm.Handle, UNIQUE_ID_EVENT);
end;


Lex_from_Belarus 08-06-2013 14:34 2164377

Кто-нибудь совладал с этим:
http://www.han-soft.com/uninshs.php

insombia 08-06-2013 14:44 2164385

какая вообще последняя версия isexec?

alert30 08-06-2013 16:11 2164422

insombia, гугл еле-еле нашел, вот это последняя версия

insombia 08-06-2013 16:18 2164427

alert30 это не последняя,эта версия не распаковывает архивы упакованные srep+precomp,а только созданные фриарком и т д

alert30 08-06-2013 17:35 2164454

insombia, перепроверил, только это, выше единичной версии нету.

APTEM2 08-06-2013 23:38 2164613

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

И как с этой ошибкой бороться

alert30 09-06-2013 06:45 2164702

APTEM2, Ваш архив со скриптом выкладывайте.

insombia 09-06-2013 09:39 2164731

APTEM2 те файлы от срепа и прекомпа,которые были для сжатия,скопируй к файлам исдона с заменой,и если есть сними ; с
#define precomp "0.42"
#define PrecompInside
#define SrepInside

APTEM2 09-06-2013 12:21 2164793

alert30, insombia,
Ребят вот скрипт поглядите http://rghost.ru/private/46620721/1d...5d3014d4ce6f10

Помогите чётам надо

saurn 09-06-2013 13:01 2164817

APTEM2, так ничего не надо, это видно из описания ошибки. Unarcl.dll не может распаковать архив, который вы к нему подцепили в виду неизвестного ему метода сжатия. Подцепите архив, упакованный в FreeArc с опциями сжатия по дефолту и проверяйте: если распаковка проходит без ошибок то, как я сказал выше, смотрите в сторону опций сжатия.

Lex_from_Belarus 09-06-2013 13:35 2164834

А кто заведует справкой? Там есть ошибка.
В описании секции [Run], есть описание флага unchecked
Код:

Действует только в секции [Run]. Указывает инсталлятору не ставить флажок в строке с параметром. Пользователь может его выбрать, если захочет его запустить. Этот флаг игнорируется, если также установлен флаг postinstall.
это не так этот флаг работает с postinstall

APTEM2 09-06-2013 15:28 2164889

saurn,
Можно поподробнее

insombia 09-06-2013 20:49 2165064

APTEM2
#define NeedMem 512
#define records
#define facompress
#define PrecompInside
#define SrepInside
#define precomp "0.42"
;#define unrar
;#define XDelta
;#define PackZIP
;#define Components

перед setup поставь

byUnit 10-06-2013 00:15 2165143

Подскажите пожалуйста. Как добавить дополнительные шаги в установщике ?

APTEM2 10-06-2013 00:16 2165144

insombia, Всё спс ребят
И ещё что нужно прописать чтобы сделать слайд-картинок во время установки работаю над другим скриптом

byUnit 10-06-2013 01:47 2165155

Inno Setup > по пунктам
 
Доброго времени суток. Поставил себе задачу написать инсталятор в программе Inno Setup. Наслышан об этой программе и её возможностям. Сидел сутки листал мануалы, перечитывал некоторые темы но всё же не нашел много ответов на свою задумку.
Я тут составил небольшой план по инсталятора (немного глупо но я теперь буду точно знать чего я хочу).

Код:

1. Приветствие с картинкой и 2 кликобательнымы кнопками
 2. Окно выбора Языка (Eng, Rus)
 3. Окно с описанием
 4. окно с соглашением установки
 5. Проверка наличия Dokan библиотеки (если нет то установить и перезагрузить комп)
 6. АВТОЗАПУСК - Продолжение установки с момента её завершения
 7. Выбор установки + дополнительная настройка
 8. Предложить установить некоторые программы
 9. Указать путь к конкретной папке (только тогда появляется кнопка Установить)
10. Завершение установки с кнопкой запустить приложение + описание над ним

Вот скажите. Это же все реально реализовать? Если да подскажите кто что может и знает! Смотрю сюда очень часто отвечу практически сразу! Заранее благодарю!

insombia 10-06-2013 07:40 2165191

APTEM2 http://narod.ru/disk/22510124000/isS...v1.02.rar.html
3 пример это картинки в самом окне инстала

byUnit что именно нужно?

byUnit 10-06-2013 13:52 2165304

Я описывал выше!

insombia 10-06-2013 16:36 2165382

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

insombia 10-06-2013 16:56 2165395

byUnit
читать дальше »
1. Приветствие с картинкой
var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;

procedure InitializeWizard();
begin
ExtractTemporaryFile('img1.bmp');

WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\img1.bmp'));



WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
end;

читать дальше »
2. Окно выбора Языка (Eng, Rus)
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl;
Name: english; MessagesFile: compiler:Languages\english.isl;

читать дальше »
6. АВТОЗАПУСК - Продолжение установки с момента её завершения
это вроде нельзя сделать

читать дальше »
8. Предложить установить некоторые программы
[Components]
Name: g0; Description: Portal 2; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed
Name: g0\c1; Description: Coop-Launcher; Types: full; Flags: dontinheritcheck
так же можно посмотреть пример в inno gamescript generator

byUnit 11-06-2013 02:16 2165644

insombia спасибо буду ковырять данные пункты
А вообще мне нужен инсталятор с моими вложенными файлами

habib2302 11-06-2013 14:57 2165899

как добавить чекбокс для удаления сохранений/настроек игры?

saurn 11-06-2013 15:12 2165909

habib2302, msgBox после деинсталяции:
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case CurUninstallStep of
        usPostUninstall:
        if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'My Game\Save') then
        begin
            if MsgBoxEx(0, 'Удалить сохранения игры находящиеся по адресу:' + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userdocs}')) + 'My Game\Save'), 'Удаление сохранений', $00000004 or $00000020, 0, 0) = IDYES then
            DelTree(AddBackslash(ExpandConstant('{userdocs}')) + 'My Game\Save', True, True, True);
        end;
    end;
end;


habib2302 11-06-2013 16:56 2165952

помогите мне пожалуйста решить проблему

insombia 11-06-2013 17:24 2165967

habib2302 переводить пробавал?
APPID_BAD_PIGGIES = '{9524C306-CC16-44A0-82AA-996409D1A059}';
здесь что-то не так

habib2302 11-06-2013 17:28 2165969

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

///////////////////////////////////Удаление других приложений при старте
function GetUninstallPath(const AppIds: array of String): array of String;
var
  StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for i := 0 to GetArrayLength(AppIds)-1 do
  begin
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
      Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;


Mafioza 11-06-2013 19:57 2166059

Всем доброго вечера , хочу задать вопрос ! Возможно ли сделать так чтобы во время установки была кнопка "Детали" где после нажатия отображались детали установил как в nsis .

insombia 11-06-2013 20:17 2166071

habib2302 что-то вроде не совпадает,та и зачем оно?

habib2302 11-06-2013 20:20 2166076

insombia, для того,чтобы перед установкой удалялась официальная игра,а вот ее appid {9524C306-CC16-44A0-82AA-996409D1A059}

saurn 11-06-2013 21:01 2166099

Цитата:

Цитата Mafioza
Возможно ли сделать так чтобы во время установки была кнопка "Детали" »

http://forum.oszone.net/post-1924556-93.html
Если подойдет Johny777 "Полезное сообщение" нажмете

Mafioza 11-06-2013 21:32 2166111

saurn спасибо

El Sanchez 11-06-2013 22:07 2166133

Цитата:

Цитата habib2302
я тоже думал,что проблемы в этом коде
если я не ошибаюсь что-то еще здесь не так »

habib2302, вместо этой строки:
Код:

Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
напишите
Код:

RegQueryStringValue(HKLM, Format('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%s_is1', [AppIds[i]]), 'UninstallString', Buff);
Buff := RemoveQuotes(Buff);

Скриптовая константа reg не может раскрыть GUID, считая его константой из-за фигурных скобок. Тут либо экранировать открывающую фигурную скобку (об этом найдете и почитаете в справке сами), либо использовать RegQueryStringValue для чтения из реестра.

habib2302 11-06-2013 22:30 2166149

El Sanchez, в справке я нашел Если требуется ввести "{", наберите ее два раза. (You do not need to double "}" characters.)
я так и делал и все равно

habib2302 12-06-2013 00:10 2166216

есть ли вообще констант к папке LocalLow

El Sanchez 12-06-2013 14:57 2166443

Цитата:

Цитата habib2302
в справке я нашел Если требуется ввести "{", наберите ее два раза. (You do not need to double "}" characters.) »

habib2302, еще ниже читайте, где описание константы reg.
Цитата:

Цитата habib2302
есть ли вообще констант к папке LocalLow »

habib2302, {userappdata}\LocalLow с проверкой на Vista и выше.

insombia 12-06-2013 21:35 2166691

кому нужно забирайте http://rghost.ru/46708307 ,logo вставляйте(рисуйте свое)

saurn 13-06-2013 13:53 2167023

Цитата:

Цитата habib2302
помогите мне пожалуйста решить проблему »

Экранировать GUID символом "{" в шестнадцатеричной кодировке не пробовали?
Код:

APPID_BAD_PIGGIES    = '%7B{9524C306-CC16-44A0-82AA-996409D1A059}';

habib2302 13-06-2013 14:09 2167030

El Sanchez,
спасибо за код.он работает
Код:

RegQueryStringValue(HKLM, Format('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%s_is1', [AppIds[i]]), 'UninstallString', Buff);
Buff := RemoveQuotes(Buff);

но появились еще проблемы.
после удаления моего репака выдает ошибку

и не удаляет оф игру,но понял почему не удаляет.инсталлятор пытается счита id у которого на конце написано _is1 {9524C306-CC16-44A0-82AA-996409D1A059}_is1,а id оф игры {9524C306-CC16-44A0-82AA-996409D1A059}
я взял в редакторе реестра в конце id дописал _is1 и оф игра стала удалятся

insombia 13-06-2013 16:29 2167122

habib2302 секция UninstallDelete выглядит так?
Type: filesandordirs; Name: {app};

habib2302 13-06-2013 16:43 2167135

insombia, у меня нету этой секции UninstallDelete

insombia 13-06-2013 16:53 2167151

habib2302 ну так добавь!как ты собрался удалять файлы без этой секции?

saurn 13-06-2013 17:22 2167169

habib2302, старый пример нормально работает
Код:

Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
Насчет удаления другой установки пока подсказать ничего не могу.
Цитата:

Цитата insombia
как ты собрался удалять файлы без этой секции? »

Эта секция требуется для удаления файлов неучтенных при установке. В остальных случаях нужды в ней нет.

semen77 14-06-2013 18:54 2167783

Здравствуйте!
Есть игра, репак. Состав простой setup.exe и setup-1.bin.
Если оба файла лежат рядом - всё устанавливается как надо.
Теперь убираем setup.exe в другую папку,и... в процессе установки просит вставить диск.
-----------------------------------------------------------------------------------------------------------------------
- Как передать параметр месторасположения setup-1.bin в инсталятор setup.exe через батник или vbs?
- Что написать в [code] чтобы инсталятор параметр принял и правильно обработал?

insombia 14-06-2013 18:57 2167784

semen77 со справки

читать дальше »
[Setup]: DiskSpanning
Возможные значения:
yes или no
Значение по умолчанию:
no

Опмсание:
При значении yesбудет производиться разбиение на диски. Определяет, создавать ли компилятору один файл SETUP.EXE, или делить его на файлы (SETUP-*.BIN), которые помещаются на дискету, CD-ROM, DVD-ROM или другой носитель. Каждый файл в своем имени будет содержать номер, по которому можно будет определить на какой диск его следует скопировать. Скопируйте SETUP.EXE и SETUP-1.BIN на первый диск, SETUP-2.BIN на второй и т. д.

В этом случае размер каждого файла и число файлов, создаваемых для каждого диска диктуется директивой DiskSliceSize и SlicesPerDisk секции [Setup]. Другие директивы, отвечающие за разбиение на диски, которые вы захотите внедрить, должны включать директивы DiskClusterSize и ReserveBytes.

Обратите внимание, что нужно обязательно задать этим директивам значение yes, если размер сжатого файла инсталлятора превышает 2,100,000,000 байт, даже если вы не планируете разбивать инсталлятор на диски. (Инсталлятор будет работать правильно, даже если все SETUP-*.BIN файлы будут размещены на одном диске).

saurn 14-06-2013 19:12 2167790

semen77, никак, насколько мне известно. setup-1.bin неотъемлимая часть инсталятора и должна находится рядом с загрузчиком *.exe

semen77 15-06-2013 08:34 2167971

insombia, saurn, я почему спросил, есть же параметры
Цитата:

/DIR="x:\dirname"
Overrides the default directory name displayed on the Select Destination Location wizard page. A fully qualified pathname must be specified. May include an "expand:" prefix which instructs Setup to expand any constants in the name. For example: '/DIR=expand:{pf}\My Program'.

/GROUP="folder name"
Overrides the default folder name displayed on the Select Start Menu Folder wizard page. May include an "expand:" prefix, see '/DIR='. If the [Setup] section directive DisableProgramGroupPage was set to yes, this command line parameter is ignored.
но они меняют другое...

или с этим
Цитата:

Prototype:
function GetCmdTail: String;
Description:
Returns all command line parameters passed to Setup or Uninstall as a single string.
или с этим
Цитата:

/LOADINF="filename"
Instructs Setup to load the settings from the specified file after having checked the command line. This file can be prepared using the
Don't forget to use quotes if the filename contains spaces.
придумать что-нибудь....

saurn 15-06-2013 13:35 2168061

Цитата:

Цитата semen77
/LOADINF="filename" »

Это всего лишь файл ответов инстала. Позволяет выполнять установку с заранее предустановленными параметрами установки.
Цитата:

Цитата semen77
function GetCmdTail: String; »

Функция возврата параметров ком.строки.
---------------------------------------------------------
По поводу указания ексишнику местоположения псевдо бинарников, знатоки скажут вам более точно. Я с таким никогда не сталкивался, и не думаю, что это возможно. Инсталлятор - *.exe, *.bin - по сути архив, разбитый на части. Все части архива должны располагатся в одной директории.

insombia 15-06-2013 17:02 2168164

у кого-то есть батники для запаковки srep+precomp? а то свои потерял

volga163@vk 15-06-2013 20:00 2168248

Здравствуйте, друзья!

Собственно, вот что я хотел у Вас спросить. Мне необходимо, чтобы во время установки загрузился файл из Интернета. Организовал я всё это дело через Inno Tools Downloader. Мне необходимо, чтобы этот загружаемый файлик сохранялся не в корневую папку установки, а в подпапку. Попытался написать вот так:

Код:

  itd_addfile('http://u.to/8Su7Aw',expandconstant('{tmp}\subdir\file')); // Пишем ссылки на файлы тут
Естественно, не качает. Выдаёт ошибку Sorry, the files could not be downloaded. Click 'Retry' to try downloading the files again, or click 'Cancel' to terminate setup. Если просто написать expandconstant('{tmp}\file'), то всё прекрасно закачивается.

Как же можно это организовать? Спасибо.

vint56 15-06-2013 20:46 2168264

volga163@vk попробуй так
CreateDir(ExpandConstant('{tmp}\subdir'));
itd_addfile('http://u.to/8Su7Aw',expandconstant('{tmp}\subdir\file')); // Пишем ссылки на файлы тут

volga163@vk 15-06-2013 21:04 2168270

Цитата vint56:
volga163@vk попробуй так »
Спасибо огромное, помогло.

Ещё один вопрос. Я использую в коде Паскаля вместо {app} WizardDirValue, но он выдаёт только папку установки по умолчанию. А как можно сделать, чтобы файлы загружались в папку, которую выбирает пользователь при установке? Код:
Код:

procedure InitializeWizard();
begin
  ITD_Init;
// Оглашаем создание папок Bukkit.
  CreateDir(WizardDirValue()+'\1.5.2 Bukkit\');
  CreateDir(WizardDirValue()+'\1.5.1 Bukkit\');
  CreateDir(WizardDirValue()+'\1.5.0 Bukkit\');
  CreateDir(WizardDirValue()+'\1.4.7 Bukkit\');
  CreateDir(WizardDirValue()+'\1.4.6 Bukkit\');
// ЗАКОНЧИЛИ ОГЛАШАТЬ СОЗДАНИЕ ПАПОК
// -------------------------
// Загружаем следующие файлы
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/02161_1.5.2-R0.2/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.2 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.2
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/02099_1.5.1-R0.3/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.1 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.1
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01980_1.5-R0.1/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.0 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.0
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01845_1.4.7-R1.0/craftbukkit.jar',Wizarddirvalue()+'\1.4.7 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.4.7
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01800_1.4.6-R0.4/craftbukkit-dev.jar',Wizarddirvalue()+'\1.4.6 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.4.6
// ЗАКОНЧИЛИ ЗАГРУЖАТЬ ФАЙЛЫ
// -------------------------
  itd_setoption('UI_DetailedMode', '1'); // Детализированный режим
  itd_downloadafter(wpInstalling); // Загружаем файл после установки
end;


saurn 16-06-2013 11:31 2168470

Цитата:

Цитата volga163@vk
Я использую в коде Паскаля вместо {app} WizardDirValue, но он выдаёт только папку установки по умолчанию »

Так и будет, даже если использовать константу {app} ничего не изменится, список папок загрузки у вас создается на этапе инициализации формы мастера, соответственно, когда у пользователя появляется возможность выбрать папку для загрузки, папки уже созданы. Вызывайте процедуру создания папок после страницы выбора папки установки(wpSelectDir), ну или создайте свою страницу, или форму, с едитом для выбора папки и вызывайте ее в нужном вам месте.

CkauNui 16-06-2013 14:16 2168544

Всем привет, когда то давно делал скрипт, работал на ура, сейчас пробую его и результат плачевный пишет про
Warning: Line 34, Column 1: [Hint] Variable 'WELCOMELABEL1' never used
Warning: Line 34, Column 1: [Hint] Variable 'FINISHEDHEADINGLABEL' never used
Посмотрите в чем может быть проблема?
Заранее большое спасибо.
Вот скрипт
читать дальше »

[Setup]
AppName=AionRus3.7full
AppVerName=3.7
DefaultDirName=l10n
AppCopyright=© 2013 Ckau
WizardImageFile=Style\Background.bmp
WizardSmallImageFile=Style\smallbitmap.bmp
SetupIconFile=F:\Games\aion_na\aion\AionClient.ico
OutputDir=E:\МастерСкая\aion\SETUP\test
Compression=lzma/Ultra

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

[Files]
Source: E:\МастерСкая\aion\SETUP\Style\ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: E:\МастерСкая\aion\SETUP\Style\Concave_Dark.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: "E:\МастерСкая\aion\FULL\1\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
[code]
var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel; MouseLabel,SiteLabel: TLabel;


const
AW_BLEND = $00080000;
AW_HIDE = $00010000;

function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_OKCANCEL) = IDOK then
begin
Confirm := False;
AnimateWindow(WizardForm.Handle, 2500, AW_BLEND or AW_HIDE);
Cancel := True;
end else
Cancel := False;
end;



procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Concave_Dark.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Concave_Dark.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;


procedure SiteLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://vk.com/aion_us', '', '', 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:=clYellow
end;

procedure InitializeWizard();
begin
WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);

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:=clYellow
SiteLabel.Caption:='Вконтакте Aion US'
SiteLabel.OnClick:=@SiteLabelOnClick
SiteLabel.OnMouseDown:=@SiteLabelMouseDown
SiteLabel.OnMouseUp:=@SiteLabelMouseUp
SiteLabel.OnMouseMove:=@SiteLabelMouseMove
SiteLabel.Parent:=WizardForm



WelcomeLabel2:= TLabel.Create(WizardForm);
WelcomeLabel2.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
WelcomeLabel2.SetBounds(230,130,340,90);
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:='Добро пожаловать в установку «Русификатора» ' + #13#10#13#10 + 'Cделайте резервную копию папки «l10n»' + #13#10#13#10 + 'Незабывайте посещать «vk.com/aion_us»' ;
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:= clYellow; //цвет надписи
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:= clYellow; //цвет надписи
PageDescriptionLabel.Parent:= WizardForm.MainPanel;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
FinishedLabel.SetBounds(230,130,340,90);
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Caption:= WizardForm.FinishedLabel.Caption;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
FinishedLabel.Caption:='Русификатор успешно установлен' + #13#10#13#10#13#10#13#10 + 'Желаю Вам приятной игры и море фана';
PageNameLabel.Caption:='ВНИМАНИЕ';
PageDescriptionLabel.Caption:= 'Внимание: укажите вашу папку с игрой. Пример: D:\Aion';
WelcomeLabel2.Font.Name:='AsiaFontNHH-OutlineAllHinting.ttf';
WelcomeLabel2.Font.Size:= 8;
FinishedLabel.Font.Name:='AsiaFontNHH-OutlineAllHinting.ttf';
FinishedLabel.Font.Size:= 10;
end;


saurn 16-06-2013 14:53 2168559

CkauNui, скрипт и сейчас работает, а то что вы принимаете за ошибку, на самом деле предупреждение компилятора что вариации для указанных стандартных контролов не используются. У вас в скрипте указанно лишь, что эти контролы скрываются, а так как существуют стандартные контролы с такими же именами, то переменные TLabel для них ведут в никуда. На работе инстала это никак не скажется, но, если это предупреждение нервирует, уберите контролы из переменных.
Есть так:
Код:

WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
Сделайте так:
Код:

WelcomeLabel2, FinishedLabel: TLabel;

volga163@vk 16-06-2013 15:01 2168564

Цитата:

Цитата saurn
Вызывайте процедуру создания папок после страницы выбора папки установки(wpSelectDir) »

Спасибо за наводку, только я немного не понял, как это сделать. Не могли бы Вы показать, как организовать вызов процедуры на этом этапе? Чего-то не получается. Просто я - новичок, ещё не во всём разобрался.

CkauNui 16-06-2013 15:06 2168570

Цитата:

Цитата saurn
CkauNui, скрипт и сейчас работает, а то что вы принимаете за ошибку, на самом деле предупреждение компилятора что вариации для указанных стандартных контролов не используются. У вас в скрипте указанно лишь, что эти контролы скрываются, а так как существуют стандартные контролы с такими же именами, то переменные TLabel для них ведут в никуда. На работе инстала это никак не скажется, но, если это предупреждение нервирует, уберите контролы из переменных. »

он скорее всего из за этого не принимает скин.
Скрины:
читать дальше »
то как было:

и как сейчас:

saurn 16-06-2013 15:52 2168602

CkauNui, лейблы к скину отношения не имеют, а так скинами не пользуюсь, подсказать по ним ничего не могу.
volga163@vk, на скрипт ваш можно глянуть?

volga163@vk 16-06-2013 15:56 2168605

Цитата:

Цитата saurn
volga163@vk, на скрипт ваш можно глянуть? »

Вот секция [code]
читать дальше »

[code]
Код:

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

function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32.dll stdcall';

Procedure BackgroundOnActivate(Sender: TObject); Begin if WizardForm.Visible then WizardForm.Show End;
// ---------------------------
// Вставляем bass.dll и музыку
// ---------------------------

const 
  BASS_SAMPLE_LOOP = 4;
  BASS_UNICODE = $80000000;
  BASS_CONFIG_GVOL_STREAM = 5;
const
  #ifndef UNICODE
    EncodingFlag = 0;
  #else
    EncodingFlag = BASS_UNICODE;
  #endif
type
  HSTREAM = DWORD;

function BASS_Init(device: LongInt; freq, flags: DWORD;
  win: HWND; clsid: Cardinal): BOOL;
  external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: string; offset1: DWORD;
  offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL;
  external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_SetConfig(option: DWORD; value: DWORD ): BOOL;
  external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Free: BOOL;
  external 'BASS_Free@files:bass.dll stdcall';

procedure InitializeWizard();
var
  s, Name: string;
  i : Integer;
  StreamHandle: HSTREAM;
  BackgroundImage: TBitmapImage;
  BackgroundForm: TForm;
begin
// ---------------
// Загрузка музыки
// ---------------
  ExtractTemporaryFile('hal1.mp3');
  if BASS_Init(-1, 44100, 0, 0, 0) then
  begin
    StreamHandle := BASS_StreamCreateFile(False,
      ExpandConstant('{tmp}\hal1.mp3'), 0, 0, 0, 0,
      EncodingFlag or BASS_SAMPLE_LOOP);
    BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
    BASS_ChannelPlay(StreamHandle, False);
  end;
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('fon.bmp')
BackgroundImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\fon.bmp'))
BackgroundImage.Parent:= BackgroundForm
  ITD_Init;
// Оглашаем создание папок Bukkit.
  CreateDir(WizardDirValue()+'\1.5.2 Bukkit\');
  CreateDir(WizardDirValue()+'\1.5.1 Bukkit\');
  CreateDir(WizardDirValue()+'\1.5.0 Bukkit\');
  CreateDir(WizardDirValue()+'\1.4.7 Bukkit\');
  CreateDir(WizardDirValue()+'\1.4.6 Bukkit\');
  CreateDir(WizardDirValue()+'\1.4.7 MCPC\');
  CreateDir(WizardDirValue()+'\1.5.1 MCPC\');
  CreateDir(WizardDirValue()+'\1.5.2 MCPC\');
// ЗАКОНЧИЛИ ОГЛАШАТЬ СОЗДАНИЕ ПАПОК
// -------------------------
// Загружаем следующие файлы
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/02161_1.5.2-R0.2/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.2 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.2
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/02099_1.5.1-R0.3/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.1 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.1
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01980_1.5-R0.1/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.0 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.0
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01845_1.4.7-R1.0/craftbukkit.jar',Wizarddirvalue()+'\1.4.7 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.4.7
  itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01800_1.4.6-R0.4/craftbukkit-dev.jar',Wizarddirvalue()+'\1.4.6 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.4.6
  itd_addfile('http://ci.md-5.net/job/MCPC-Plus-Legacy/lastSuccessfulBuild/artifact/target/mcpc-plus-legacy-1.4.7-R1.1-SNAPSHOT-f534-L67.jar',Wizarddirvalue()+'\1.4.7 MCPC\'+'craftubkkit-1.0.0-SNAPSHOT.jar'); // MCPC+ Legacy 1.4.7
  itd_addfile('http://ci.md-5.net/job/MCPC-Plus/lastSuccessfulBuild/artifact/target/mcpc-plus-151compat-1.5.2-R1.1-forge736-C549.jar',Wizarddirvalue()+'\1.5.1 MCPC\'+'craftubukkit-1.0.0-SNAPSHOT.jar'); // MCPC+ 1.5.1
  itd_addfile('http://ci.md-5.net/job/MCPC-Plus/lastSuccessfulBuild/artifact/target/mcpc-plus-1.5.2-R1.1-forge736-B549.jar',Wizarddirvalue()+'\1.5.2 MCPC\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // MCPC+ 1.5.2
// ЗАКОНЧИЛИ ЗАГРУЖАТЬ ФАЙЛЫ
// -------------------------
  itd_setoption('UI_DetailedMode', '1'); // Детализированный режим
  itd_downloadafter(wpInstalling); // Загружаем файл после установки
end;

procedure DeinitializeSetup;
begin
  BASS_Free;
end;


saurn 16-06-2013 17:12 2168645

volga163@vk,
Скрипт *обновлено
Код:

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

function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32.dll stdcall';

Procedure BackgroundOnActivate(Sender: TObject); Begin if WizardForm.Visible then WizardForm.Show End;
// ---------------------------
// Вставляем bass.dll и музыку
// ---------------------------

const
 
BASS_SAMPLE_LOOP = 4;
  BASS_UNICODE = $80000000;
  BASS_CONFIG_GVOL_STREAM = 5;
  #ifndef UNICODE
   
EncodingFlag = 0;
  #else
   
EncodingFlag = BASS_UNICODE;
  #endif
type
 
HSTREAM = DWORD;

function BASS_Init(device: LongInt; freq, flags: DWORD;
  win: HWND; clsid: Cardinal): BOOL;
  external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: string; offset1: DWORD;
  offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL;
  external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_SetConfig(option: DWORD; value: DWORD ): BOOL;
  external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Free: BOOL;
  external 'BASS_Free@files:bass.dll stdcall';

procedure InitializeWizard();
var
 
s, Name: string;
  i : Integer;
  StreamHandle: HSTREAM;
  BackgroundImage: TBitmapImage;
  BackgroundForm: TForm;
begin
// ---------------
// Загрузка музыки
// ---------------
 
ExtractTemporaryFile('hal1.mp3');
  if BASS_Init(-1, 44100, 0, 0, 0) then
  begin
   
StreamHandle := BASS_StreamCreateFile(False,
      ExpandConstant('{tmp}\hal1.mp3'), 0, 0, 0, 0,
      EncodingFlag or BASS_SAMPLE_LOOP);
    BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
    BASS_ChannelPlay(StreamHandle, False);
  end;
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('fon.bmp')
BackgroundImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\fon.bmp'))
BackgroundImage.Parent:= BackgroundForm
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case
CurPageID of
   
wpInstalling:
        begin
           
ITD_Init;
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.5.2 Bukkit\');
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.5.1 Bukkit\');
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.5.0 Bukkit\');
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.4.7 Bukkit\');
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.4.6 Bukkit\');
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.4.7 MCPC\');
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.5.1 MCPC\');
            CreateDir(AddBackslash(Wizarddirvalue()) + '\1.5.2 MCPC\');
            itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/02161_1.5.2-R0.2/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.2 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.2
           
itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/02099_1.5.1-R0.3/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.1 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.1
           
itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01980_1.5-R0.1/craftbukkit-dev.jar',Wizarddirvalue()+'\1.5.0 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.5.0
           
itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01845_1.4.7-R1.0/craftbukkit.jar',Wizarddirvalue()+'\1.4.7 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.4.7
           
itd_addfile('http://dl.bukkit.org/downloads/craftbukkit/get/01800_1.4.6-R0.4/craftbukkit-dev.jar',Wizarddirvalue()+'\1.4.6 Bukkit\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // Bukkit 1.4.6
           
itd_addfile('http://ci.md-5.net/job/MCPC-Plus-Legacy/lastSuccessfulBuild/artifact/target/mcpc-plus-legacy-1.4.7-R1.1-SNAPSHOT-f534-L67.jar',Wizarddirvalue()+'\1.4.7 MCPC\'+'craftubkkit-1.0.0-SNAPSHOT.jar'); // MCPC+ Legacy 1.4.7
           
itd_addfile('http://ci.md-5.net/job/MCPC-Plus/lastSuccessfulBuild/artifact/target/mcpc-plus-151compat-1.5.2-R1.1-forge736-C549.jar',Wizarddirvalue()+'\1.5.1 MCPC\'+'craftubukkit-1.0.0-SNAPSHOT.jar'); // MCPC+ 1.5.1
           
itd_addfile('http://ci.md-5.net/job/MCPC-Plus/lastSuccessfulBuild/artifact/target/mcpc-plus-1.5.2-R1.1-forge736-B549.jar',Wizarddirvalue()+'\1.5.2 MCPC\'+'craftbukkit-1.0.0-SNAPSHOT.jar'); // MCPC+ 1.5.2
           
itd_setoption('UI_DetailedMode', '1'); // Детализированный режим
           
itd_downloadafter(wpInstalling); // Загружаем файл после установки
       
end;
    end;
end;

procedure DeinitializeSetup;
begin
   
BASS_Free;
end;


volga163@vk 16-06-2013 17:28 2168649

saurn, Если сделать, как у Вас, InnoTools Downloader не может скачать файлы:
Sorry, the files could not be downloaded. Click 'Retry' to try downloading the files again, or click 'Cancel' to terminate setup.
Какие ещё могут быть идеи? :sorry:

volga163@vk 16-06-2013 18:00 2168667

Цитата:

Цитата saurn
архив с вашим скриптом и набором файлов необходимых для работы инстала »

Вот: http://rghost.ru/46797068 Программа + файлы для инстала + скрипт (~7 мегабайт)

saurn 16-06-2013 18:23 2168675

volga163@vk, обновил свой предыдущий пример http://forum.oszone.net/post-2168645-646.html

volga163@vk 16-06-2013 18:55 2168685

saurn, Спасибо ОГРОМНОЕ, теперь всё работает. Разобрался.

habib2302 16-06-2013 20:44 2168739

люди помогите мне.я делаю репак chemax & chemax rus.скрипт я брал за основу скрипта aida64.ситуация такая при выборе двух компонентов все файлы дву chemax'ов копируются в одну общую папку и получается вот так

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

R.i.m.s.k.y. 16-06-2013 20:45 2168741

habib2302, угадай, мы попросим показать скрипт или нет?

habib2302 16-06-2013 21:14 2168764

R.i.m.s.k.y., sorry!!!
RGhost

saurn 16-06-2013 21:16 2168767

habib2302, в том скрипте аиды это реализовано, причем первый раз мной же. Ну вот что тут сложного, вроде не новичек. Да и в справке описано.
Код:

[Files]
Source: Компонент 1\*; DestDir: {app}\Компонент 1; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion; Components: programms1;
Source: Компонент 2\*; DestDir: {app}\Компонент 2; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion; Components: programms2;

[Components]
Name: programms1; Description: бла-бла-бла1;
Name: programms2; Description: бла-бла-бла2;


volga163@vk 16-06-2013 21:52 2168785

Друзья, а ни у кого не получилось русифицировать Inno Tools Downloader? Кракозяблики в любой кодировке выходят (пробовал ANSI, UTF-8, Win-1251, Win-1252).

habib2302 16-06-2013 22:08 2168797

я дописал то,что выделено жирным в коде и все равно
Код:

Source: Компонент 1\*; DestDir: {app}\Компонент 1; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion; Components: programms1;
Source: Компонент 2\*; DestDir: {app}\Компонент 2; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion; Components: programms2;


saurn 16-06-2013 22:13 2168802

habib2302, ну вот я дописал имена подпапок и все устанавливается
Код:

Source: {app}\{#CheMax}\*; DestDir: {app}\Original; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion; Components: CheatsMaximal\CheMax;
Source: {app}\{#CheMaxRus}\*; DestDir: {app}\Russian; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion; Components: CheatsMaximal\CheMaxRus;

Только для ярлыков измените пути согласно значениям DestDir

habib2302 16-06-2013 22:22 2168805

saurn,
RGhost

CkauNui 17-06-2013 09:39 2168948

Со скином разобрался (была проблема в isskin.dll)
Теперь нужна помощь.
Хочу сделать выбор компонентов:
-----
Обычный шрифт
Красивый шрифт
-----
Обычный хит-бар
Хит-бар версия 1
Хит-бар версия 2
----
и все в таком духе, вопрос как сделать чтобы при выборе "обычный шрифт" галка с "красивый шрифт" снималась автоматически, тоесть или то или то. И во 2 выборе хитбаров тоже самое. Желательно чтоб к каждому пункту можно было прикрутить картинку (например при наведении мыши или при выборе картинка показыывается в отдельно окне)
Благодарю заранее.

Немного разобрался:
читать дальше »

[Components]
Name: shrift; Description: Шрифты; Flags: checkablealone fixed; Types: custom compact full
Name: shrift\r; Description: Обычне шрифты; Flags: exclusive; Types: custom compact full
Name: shrift\s; Description: Красивые шрифты; Flags: exclusive; Types: custom compact
Name: hitbar; Description: Хит бар; Flags: checkablealone fixed; Types: custom compact full
Name: hitbar\r; Description: Хит бар обычный; Flags: exclusive; Types: custom compact full
Name: hitbar\s; Description: Хит бар с мемами; Flags: exclusive; Types: custom compact

Остался вопрос с возможностью добавления картинок к пунктам, и возможно ли поменять цвет у fixed элементов ? Также можно ли настроить порядок установки (или они устанавливаются так, как я прописал в [Files] ?) и как сделать чтобы не выскакивало окошко о уже установленных компонентах ?

R.i.m.s.k.y. 17-06-2013 19:08 2169347

volga163@vk, а 866 кодировку не пробовал? дос он такой, вечтозеленовый

R.i.m.s.k.y. 17-06-2013 19:38 2169363

Цитата CkauNui:
они устанавливаются так, как я прописал в [Files] »
да, сверху вниз
Цитата CkauNui:
как сделать чтобы не выскакивало окошко о уже установленных компонентах ? »
Flags: disablenouninstallwarning
Цитата:

disablenouninstallwarning
Instructs Setup not to warn the user that this component will not be uninstalled after he/she deselected this component when it's already installed on his/her machine.

Depending on the complexity of your components, you can try to use the [InstallDelete] section and this flag to automatically 'uninstall' deselected components.


Johny777 17-06-2013 19:44 2169372

CkauNui,
Цитата:

Цитата CkauNui
возможностью добавления картинок к пунктам »

так сойдёт: ?
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
Compression=none
AppId=TheBestAppId
DisableWelcomePage=yes
DisableFinishedPage=yes
DisableDirPage=yes
DisableReadyPage=yes


[Components]
Name: hl2; Description: Half-Life 2; Flags: disablenouninstallwarning
Name: hl2\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: hl2\en; Description: English; Flags: disablenouninstallwarning exclusive

Name: ep1; Description: Half-Life 2 Episode One; Flags: disablenouninstallwarning
Name: ep1\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: ep1\en; Description: English; Flags: disablenouninstallwarning exclusive

Name: ep2; Description: Half-Life 2 Episode Two; Flags: disablenouninstallwarning
Name: ep2\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: ep2\en; Description: English; Flags: disablenouninstallwarning exclusive

Name: portal; Description: Portal; Flags: disablenouninstallwarning
Name: portal\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: portal\en; Description: English; Flags: disablenouninstallwarning exclusive


[Files]
Source: Wasteland_Scanner_con.bmp; Flags: dontcopy nocompression
Source: Strider_early2.bmp; Flags: dontcopy nocompression
Source: Cremator_poster.bmp; Flags: dontcopy nocompression
Source: Portal.bmp; Flags: dontcopy nocompression


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

const
   
UNDEF_INDEX = -777;
    ALPHA_BLEND_LEVEL = 128; // max=Byte=255

   
WS_EX_LAYERED = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY = 1;
    LWA_ALPHA = 2;
    GWL_EXSTYLE = (-20);


var
   
InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;


type
   
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
   
pt: TPoint;
begin
    if not
GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with
PicForm do
        begin
           
SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            Show;
        end;
    finally
       
SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
   
UndefPic: String;
begin
    if
Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case
TNewCheckListBox(Sender).ItemCaption[Index] of
           
'Half-Life 2': UndefPic := 'Wasteland_Scanner_con.bmp';
            'Half-Life 2 Episode One': UndefPic := 'Strider_early2.bmp';
            'Half-Life 2 Episode Two': UndefPic := 'Cremator_poster.bmp';
            'Portal': UndefPic := 'Portal.bmp';
        else
            begin
               
LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
       
LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
   
PicForm.Hide;
    LastIndex := -1;
end;


procedure InitInfo();
begin
   
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
       
BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
           
Parent := PicForm;
            AutoSize := True;
        end;
    end;
    SetWindowLong(PicForm.Handle, GWL_EXSTYLE, GetWindowLong(PicForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(PicForm.Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
end;


procedure InitializeWizard();
begin
   
InitInfo();
end;


скрин:

наглядный пример: http://sendfile.su/905839
Цитата:

Цитата CkauNui
и как сделать чтобы не выскакивало окошко о уже установленных компонентах ? »

секция компонентов, флаг disablenouninstallwarning. Пример выше ^
Цитата:

Цитата CkauNui
и возможно ли поменять цвет у fixed элементов ? »

Редактируй скин
Цитата:

Цитата CkauNui
или они устанавливаются так, как я прописал в [Files] ? »

да, и никак иначе. Меняй порядок, если надо

UPD: Немного улучшил код "картинки-подсказки". Демо перезалито!

habib2302 17-06-2013 21:30 2169436

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

insombia 17-06-2013 22:09 2169463

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

saurn 17-06-2013 22:32 2169481

Цитата:

Цитата habib2302
переводился в зависимости от выбраного языка »

Как обычно самым простым способом, при помощи секции CustomMessages
Код:

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

[CustomMessages]
Russian.MsgUnins=Текст сообщения на русском
English.MsgUnins=Текст сообщения на буржуйском


CkauNui 17-06-2013 23:29 2169512

R.i.m.s.k.y., Johny777, Большущее вам спасибо)
Johny777, в том скрипте выдает ошибку TItemArea, в чем может быть трабла ?

Johny777 17-06-2013 23:44 2169526

CkauNui,
Цитата:

Цитата CkauNui
в том скрипте выдает ошибку TItemArea, в чем может быть трабла ? »

Пардон. Забыл что у кого-то может быть стандартная инно :(
Установи расширенную версию инно из шапки




UPD:

Моя версия: http://sendfile.su/827598

CkauNui 17-06-2013 23:52 2169528

Цитата:

Цитата Johny777
Пардон. Забыл что у кого-то может быть стандартная инно
Установи расширенную версию инно из шапки »

качал последнюю от сюда http://restools.hanzify.org/article.asp?id=47
можете скинуть свою версию inno?

Все работает отлично, спасибо ещё раз.

habib2302 20-06-2013 17:14 2171308

можно сделать список компонентов который можно скрыть и раскрыть?

saurn 20-06-2013 17:46 2171315

Цитата:

Цитата habib2302
можно сделать список компонентов который можно скрыть и раскрыть? »

Код:

[Setup]
AlwaysShowComponentsList=no

[Components]
Name: eng; Description: Английская версия; Types : full;
Name: rus; Description: Русская версия; Types : full;

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


insombia 20-06-2013 18:38 2171335

habib2302 когда-то мне гном давал пример,что компоненты типа выежают из инстала,если найду кину
нашел
читать дальше »
var
NewButton1: TNewButton;
Panel1: TPanel;

procedure NewButton1Click(Sender: TObject);
var
i:integer;
begin
i:=Panel1.Left;
If i= -Panel1.Width then
begin
WizardForm.CancelButton.Enabled:=False;
WizardForm.NextButton.Enabled:=False;
WizardForm.BackButton.Enabled:=False;
WizardForm.DirBrowseButton.Enabled:=False;
while True do
begin
Panel1.Left:= ScaleX(i);
WizardForm.SelectDirPage.Repaint;
if i=0 then Break;
i:=i+1;
end;
end else
begin
while True do
begin
Panel1.Left:= ScaleX(i);
WizardForm.SelectDirPage.Repaint;
if i=-Panel1.Width then Break;
i:=i-1;
end;
WizardForm.CancelButton.Enabled:=True;
WizardForm.NextButton.Enabled:=True;
WizardForm.BackButton.Enabled:=True;
WizardForm.DirBrowseButton.Enabled:=True;
end;
end;

procedure InitializeWizard();
begin
{ Panel1 }
Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
Parent := WizardForm.SelectDirPage;
Top := ScaleY(0);
Width := WizardForm.SelectDirPage.Width;
Height := WizardForm.SelectDirPage.Height;
Left := -Panel1.Width;
end;

WizardForm.ComponentsDiskSpaceLabel.Parent := Panel1;
WizardForm.ComponentsList.Parent := Panel1;
WizardForm.TypesCombo.Parent := Panel1;
WizardForm.SelectComponentsLabel.Parent := Panel1;

NewButton1 := TNewButton.Create(WizardForm);
with NewButton1 do
begin
Parent := WizardForm;
Left := ScaleX(32);
Top := ScaleY(327);
Width := ScaleX(75);
Height := ScaleY(25);
Caption := 'Компоненты';
OnClick := @NewButton1Click;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
NewButton1.Hide;
if CurPageID=wpSelectDir then NewButton1.Show;
end;

Crazy Noise 20-06-2013 19:46 2171371

habib2302, Есть ещё такой вариант
читать дальше »
Код:

[Components]
Name: comp; Description: comp; Flags: collapsed
Name: comp\a; Description: comp a
Name: comp\b; Description: comp b

[Code]
procedure InitializeWizard();
begin
WizardForm.ComponentsList.TreeViewStyle := True;
end;


habib2302 20-06-2013 21:12 2171402

insombia, получается пустая страница компонентов

insombia 20-06-2013 21:50 2171428

habib2302 а у тебя компоненты вообще в скрипте прописаны?

habib2302 20-06-2013 21:58 2171432

insombia, да

insombia 20-06-2013 22:08 2171438

habib2302 кинь скрипт с файлами(можешь в лс если хочешь)

saurn 20-06-2013 23:33 2171455

Цитата:

Цитата habib2302
получается пустая страница компонентов »

Скрипт покажите

insombia 21-06-2013 07:56 2171535

habib2302 кароче там нужно будет просто скрыть страницу компонентов и все

mifkys 21-06-2013 09:46 2171569

Добрый день. Может кто подсказать? Как прервать установку после ошибки одного из файлов, запускаемого через секцию Run? У меня в этой секции с ошибкой вылетает программа unzip.exe и, соответственно, мне нужно остановить дальнейшие действия, выполняемые с распакованными файлами.

insombia 21-06-2013 16:52 2171783

mifkys Check: CheckError пробовал такое добавлять?

mifkys 24-06-2013 11:39 2173231

Цитата:

Цитата insombia
mifkys Check: CheckError пробовал такое добавлять? »

а что это такое? пробовал вставитЬ, говорит, что неизвестная функция

El Sanchez 24-06-2013 12:33 2173282

Цитата:

Цитата mifkys
а что это такое? пробовал вставитЬ, говорит, что неизвестная функция »

mifkys, потому как insombia не потрудился описать функцию CheckError и дать указание в каких строках необходимо вставить директиву Check. Да и не это вам нужно. Нужно проверять код возврата unzip.exe. Если он не равен 0, то установщик прерывает работу. В секции Run код возврата не проверить, поэтому распаковку нужно описать в секции Code. Допустим, распаковка идет в первую очередь, unzip.exe включен в состав установщика, архивы рядом с установщиком, тогда для распаковки подходит этап ssInstall:
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
   
ResultCode: Integer;
begin
    case
CurStep of
       
ssInstall: begin
           
ExtractTemporaryFile('unzip.exe');
            Exec(ExpandConstant('{tmp}\unzip.exe'), ExpandConstant('"{src}\arcname.zip"'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
            if ResultCode <> 0 then Abort;
        end;
    end;
end;


insombia 24-06-2013 12:33 2173283

del

mifkys 24-06-2013 12:43 2173289

еще такой вопрос. Можно ли во время установки после каждой записи в блоке [Run] выводить окно о запросе на продолжение установки, чтобы пользователь сам нажимал "Далее"

Цитата:

Цитата El Sanchez
mifkys, потому как insombia не потрудился описать функцию CheckError и дать указание в каких строках необходимо вставить директиву Check. Да и не это вам нужно. Нужно проверять код возврата unzip.exe. Если он не равен 0, то установщик прерывает работу. В секции Run код возврата не проверить, поэтому распаковку нужно описать в секции Code. Допустим, распаковка идет в первую очередь, unzip.exe включен в состав установщика, архивы рядом с установщиком, тогда для распаковки подходит этап ssInstall: »

спасибо, попробую

El Sanchez 24-06-2013 13:56 2173350

Цитата:

Цитата mifkys
Можно ли во время установки после каждой записи в блоке [Run] выводить окно о запросе на продолжение установки, чтобы пользователь сам нажимал "Далее" »

mifkys, можно. Вопрос в том, что делать, если пользователь не захочет продолжать. В таком случае прервать работу установщика не удасться.

mifkys 24-06-2013 17:08 2173477

Цитата:

Цитата El Sanchez
Вопрос в том, что делать, если пользователь не захочет продолжать. В таком случае прервать работу установщика не удасться. »

не подскажете как? Мне отменять не надо. Просто нужно контролировать продолжение установки в силу специфики запускаемых приложений.

Johny777 24-06-2013 18:42 2173533

mifkys,
Цитата:

Цитата mifkys
не подскажете как? »

здесь уже через Check: функция с булев значением на выходе(),
если я правильно понимаю поставленную тобой задачу
Пример:
читать дальше »
Код:

[Run]
Description: {cm:LaunchProgram, Half-Life}; Filename: {app}\half-life\Half-Life.exe; WorkingDir: {app}\half-life; Check: ConfirmRun('{cm:LaunchProgram, Half-Life}?');
Description: {cm:LaunchProgram, Half-Life Blue Shift}; Filename: {app}\half-life blue shift\Half-Life Blue Shift_unlocked.exe; WorkingDir: {app}\half-life blue shift; Check: ConfirmRun('{cm:LaunchProgram, Half-Life Blue Shift}?');
Description: {cm:LaunchProgram, Half-Life Opposing Force}; Filename: {app}\half-life opposing force\Half-Life Opposing Force.exe; WorkingDir: {app}\half-life opposing force; Check: ConfirmRun('{cm:LaunchProgram, Half-Life Opposing Force}?');
Description: {cm:LaunchProgram, Half-Life Decay}; Filename: {app}\half-life decay\Half-Life Decay.exe; WorkingDir: {app}\half-life decay; Check: ConfirmRun('{cm:LaunchProgram, Half-Life Decay}?');



[code  ]
function ConfirmRun(const cMessage: String): Boolean;
begin
    if
MsgBox(ExpandConstant(cMessage), mbConfirmation, MB_YESNO) = IDYES then Result := True;
end;



В функции с выводом булев значения зарезервированная переменная Result инициализируется со значением False по дефолту.
Поэтому в данном случае True будет только если функция вывода диалогового окна винды вернёт число под константой IDYES, то бишь пользователь нажмёт "Да"

если Check получит True, то будет "выполнена строка", в данном случае запуск, если False то ничего не произойдёт,
те проверка производится перед действием описанным в строке до которой дошла очередь

Lex_from_Belarus 25-06-2013 23:34 2174344

а как сдлеать так чтобы, если Win 32bit, то в секции [Run] выполнится одни, а если Win 64 bit, то другой?

Johny777 26-06-2013 00:19 2174372

Lex_from_Belarus, Таким же макаром:
Код:

[Run]
// Will Run only on Win 64
Description: {cm:LaunchProgram, Half-Life}; Filename: {app}\half-life\Half-Life.exe; WorkingDir: {app}\half-life; Check: IsWin64();

// Will Run only on Win 32
Description: {cm:LaunchProgram, Half-Life Decay}; Filename: {app}\half-life decay\Half-Life Decay.exe; WorkingDir: {app}\half-life decay; Check: not IsWin64();


PS: Кстати подобный вопрос уже много раз был задан и получил ответ. Юзай поиск почаще!

Lex_from_Belarus 26-06-2013 14:30 2174662

Johny777, да я так пробовал, у меня был вариант:

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

[Files]
Source: "e:\xxx\file_32.exe"; Check: full or medium or lite and not isWin64; DestDir: "{tmp}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "e:\xxx\file_64.exe"; Check: full or medium or lite and isWin64; DestDir: "{tmp}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Run]
Filename: "{tmp}\file_32.exe"; Parameters: "/s"; Check: full or medium or lite; StatusMsg: "Установка file_32...";
Filename: "{tmp}\file_64.exe"; Parameters: "/s"; Check: full or medium or lite; StatusMsg: "Установка file_64...";


я сделал:

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

[Files]
Source: "e:\xxx\file_32.exe"; Check: full or medium or lite and not isWin64; DestDir: "{tmp}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "e:\xxx\file_64.exe"; Check: full or medium or lite and isWin64; DestDir: "{tmp}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Run]
Filename: "{tmp}\file_32.exe"; Parameters: "/s"; Check: full or medium or lite and not isWin64; StatusMsg: "Установка file_32...";
Filename: "{tmp}\file_64.exe"; Parameters: "/s"; Check: full or medium or lite and isWin64; StatusMsg: "Установка file_64...";


full, medium, lite - это я так реализовал условия для установки и этот файл во все три варианта входит
но к сожалению и 32 и 64 на 64-ке установились

Habetdin 26-06-2013 18:11 2174842

Lex_from_Belarus, попробуйте так:
Цитата:

Check: (full or medium or lite) and not isWin64;
Цитата:

Check: (full or medium or lite) and isWin64;

Lex_from_Belarus 26-06-2013 19:03 2174866

Вот спасибо, а я даже и не подумал об этом :)

Dinvin4ester 27-06-2013 16:55 2175324

http://i47.fastpic.ru/big/2013/0627/...406fa3598c.png
И снова я . Помогите решить эту проблему - http://sendfile.su/831604

insombia 27-06-2013 17:38 2175365

Dinvin4ester та задолбали вы уже,читайте справку к исдону,или листайте страницы!!!
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\ВАШ АРХИВ'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;

Dinvin4ester 27-06-2013 19:31 2175441

insombia,
Вы хоть скрипт смотрели , просто я не могу найти .

vint56 27-06-2013 20:11 2175465

Dinvin4ester, ПАПКА Modules\ISDone В САМОМ НИЗУ

Dinvin4ester 27-06-2013 20:20 2175470

Да хз , а можно вообще убрать , архивы ведь не использую , а пользуюсь средствами инно .

vint56 27-06-2013 20:21 2175471

Dinvin4ester, сделай так
//f not ISArcExtract ( 0, 0, ExpandConstant('{src}\ВАШ АРХИВ'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;

Dinvin4ester 27-06-2013 20:33 2175477

vint56,
Теперь ошибку выдает при компиляции - http://i48.fastpic.ru/big/2013/0627/...215f61adaf.png . Ребята извините если что не так . Это последняя просьба )

vint56 27-06-2013 20:35 2175479

Dinvin4ester, что ты закаментировал или правил

Dinvin4ester 27-06-2013 20:39 2175480

Как вы и сказали в исдон - // добавил и все .

vint56 27-06-2013 21:01 2175495

Dinvin4ester, все работает
http://rghost.ru/47060078

Dinvin4ester 27-06-2013 21:19 2175507

vint56,
И еще задам нубский вопрос - куда прописать саму папку и файлы ехе ? А то компилирую и ставится сам скрипт .

vint56 27-06-2013 21:30 2175511

Dinvin4ester, отвечаю на твой последний вопрос а дальше читай справку
[Files]
Source: "C:\Games\Ubisoft\Tom Clancy's Splinter Cell Chaos Theory\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

Dinvin4ester 27-06-2013 21:36 2175513

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

Dinvin4ester 28-06-2013 22:30 2176138

Ребя и опять я . Хочу узнать как прописать в скрипте установку русификатора на выбор и таблеток тоже . Куда и что прописать ? Спасибо .

vint56 28-06-2013 23:07 2176163

Dinvin4ester
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;
Name: nodvd; Description: Язык озвучки; Types: full; Flags: fixed
Name: nodvd\1; Description: Таблетка RELOADED; Flags: exclusive;
Name: nodvd\2; Description: Таблетка SKIDROW; Flags: exclusive;

[Files]
Source: "RusText\*"; DestDir: "{app}"; Flags: ignoreversion; Components: text\rus;
Source: "EngText\*"; DestDir: "{app}"; Flags: ignoreversion; Components: text\eng;
Source: "RusVoice\*"; DestDir: "{app}"; Flags: ignoreversion; Components: voice\rus;
Source: "EngVoice\*"; DestDir: "{app}"; Flags: ignoreversion; Components: voice\eng;
Source: "NoDVD 1\*"; DestDir: "{app}"; Flags: ignoreversion; Components: nodvd\1;
Source: "NoDVD 2\*"; DestDir: "{app}"; Flags: ignoreversion; Components: nodvd\2;

Lex_from_Belarus 29-06-2013 00:41 2176204

подскажите, так инсталятор созданный версией 5.5.1 не распаковывается?

saurn 29-06-2013 05:40 2176236

Lex_from_Belarus,
Если версия Inno расширенная, то и не распакуется.

habib2302 29-06-2013 14:07 2176331

доброе время суток.Помогите мне решить одну проблему.Короче.я использую код для удаления других приложений.
Код:

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

const
   
    WAIT_OBJECT_0 = $0;
    STARTF_USESHOWWINDOW  = 1;
    NORMAL_PRIORITY_CLASS = $00000020;
    INFINITE = $FFFFFFFF;    { Infinite timeout }

type
    _STARTUPINFO = record
        cb: DWORD;
        #ifdef UNICODE
            lpReserved, lpDesktop, lpTitle: PAnsiChar;
        #else
            lpReserved, lpDesktop, lpTitle: PChar;
        #endif
        dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
        wShowWindow, cbReserved2: Word;
        lpReserved2: Byte;
        hStdInput, hStdOutput, hStdError: THandle;
    end;

    _PROCESS_INFORMATION = record
        hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif


function UninstallMyApp(): Boolean;
var
    pi: _PROCESS_INFORMATION;
    si: _STARTUPINFO;
    Buff: String;
    i: Integer;
begin
    if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDNO then Exit;
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
    Result := Buff = '';
    if not Result then
    begin
        si.cb := SizeOf(si);
        si.dwFlags := STARTF_USESHOWWINDOW;
        si.wShowWindow := SW_SHOWNORMAL;
        #ifdef UNICODE
        if not CreateProcess('', PAnsiChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #else
        if not CreateProcess('', PChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
        #endif
        begin
            MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
            Exit;
        end;
        try
            while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
        finally
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
            Result := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}')) = '';
        end;
    end;
end;


function InitializeSetup(): Boolean;
begin
    Result := UninstallMyApp();
end;

при первом запуске появляется диалог

но программа ранее не была установлена
вот мой скрипт

saurn 29-06-2013 20:23 2176493

habib2302, если мне не изменяет память, в оригинале у Johny777 это код выглядит несколько иначе:
читать дальше »
Код:

function GetUninstallPath(const AppIds: array of String): array of String;
var
  StringList: TStringList;
  i, Len: Integer;
  Buff: String;
begin
  for i := 0 to GetArrayLength(AppIds)-1 do
  begin
    Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
    if Buff <> '' then
    begin
      Len := GetArrayLength(Result);
      SetArrayLength(Result, Len+1);
      Result[Len] := Buff;
    end;
  end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
  pi: _PROCESS_INFORMATION;
  si: _STARTUPINFO;
  i: Integer;
begin
  for i := 0 to GetArrayLength(UninstallPathes)-1 do
  begin
    si.cb := SizeOf(si);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := SW_SHOWNORMAL;
    #ifdef UNICODE
      if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #else
      if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
    #endif
    begin
      MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
      Exit;
    end;
    try
      while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
    finally
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    end;
  end;
end;

function InitializeSetup:boolean;
var
  i, Len: Integer;
  uArray: array of String;
begin
  uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES, APPID_AIDA_ENGINEER] );
  Len := GetArrayLength(uArray);
  Result := Len = 0;
  if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
  begin
    UninstallApps(uArray);
    Result := InitializeSetup();
  end;
end;


А вот это вот что:
Код:

if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDNO then Exit;
Зачем MsgBox вызывается в самом начале функции без каких либо условий, тогда когда его нужно вызывать только в том случае, если результат поиска установленного приложения будет True. Естественно он будет светится всегда. Что перевернули в скрипте, переворачивайте обратно и все будет работать.

P.S.
Я понимаю, что вы не ищите легких путей, однако зачем использовать такую махину для банального удаления программы, когда можно обойтись всего несколькими строчками?

saurn 30-06-2013 10:32 2176709

Всем доброго времени суток. Объясните пожалуйста неучу, как реализовать следующее: нужно, чтобы в процессе работы инсталл периодически проверял наличие некоего файла на диске, если файл, вдруг, будет удален в процессе работы, то станет неактивной некая кнопка, если же файл появится кнопка вновь будет задействована. Самодостаточный пример не обязателен, хочу узнать сам принцип.

Johny777 30-06-2013 12:39 2176734

saurn, создавай таймер на этапе ssInstall , а на ssPostInstall освобождай. В процедуре которую он будет выполнять опиши нужное тебе действие типа MyButton.Enabled := FileExists('...');

=============================================
Цитата:

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

Целью было ожидание завершение процесса создаваемого при запуске. Ожидание через WaitForSingleObject() http://fkn.ktu10.com/?q=node/633 с "бесконечным" ожиданием, пока процесс не завершится, но ей нужен хэндл (описатель) процесса, которой можно получить напрямую из структуры _PROCESS_INFORMATION, Его также можно получить по ай-ди процесса и даже по хэндлу окна, но стандартны функции инно не возвращают всего этого и ждать завершения не получитсая. Просто на ранних этапах с использованием Exec(... ,ewWaitUntilTerminated) я получал сразу несколько окон на запрос деинсталляции и окно программы установки, а теперь всё по порядку

saurn 30-06-2013 12:51 2176739

Johny777, в том случае понятно для чего, там могло выполнятся удаление сразу нескольких приложений, но в последнем случае только одно, так что наверное будет достаточно и Exec с ewWaitUntilTerminated))
Цитата:

Цитата Johny777
создавай таймер на этапе ssInstall »

Благодарю за подсказку, всё получилось, как нужно :)

Johny777 30-06-2013 13:24 2176751

Цитата:

Цитата saurn
так что наверное будет достаточно и Exec с ewWaitUntilTerminated)) »

так точно.


habib2302, вот пример:
читать дальше »
Код:

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

[code  ]                         


function UninstallMyApp(): Boolean;
var
   
Buff: String;
    i: Integer;
begin
   
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
    if not Result then Result := not FileExists(RemoveQuotes(Buff));
    if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDYES then
    try
       
Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
    finally
       
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
        if not Result then MsgBox('Удаление завершилось неудачей, бывай!', mbError, MB_OK);
    end;
end;



function InitializeSetup(): Boolean;
begin
   
Result := UninstallMyApp();
end;



UPD: Улучшил пример!

habib2302 30-06-2013 14:33 2176773

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

saurn 30-06-2013 15:03 2176791

habib2302, при помощи CustomMessages ,было уже: http://forum.oszone.net/post-2169481-665.html

habib2302 30-06-2013 15:39 2176809

saurn, т.е ты имеешь виду перевести info.rtf

Johny777 30-06-2013 15:56 2176818

habib2302, saurn,
Цитата:

Цитата habib2302
info.rtf »

[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl; InfoBeforeFile: Russian.rtf
Name: English; MessagesFile: compiler:Languages\English.isl; InfoBeforeFile: English.rtf

с InfoAfter, лицензионным соглашением нужно также, чтоб они отображались в зависимости от активного языка

PS habib2302,
Цитата:

Цитата habib2302
всем доброе время суток.как сделать,чтобы файл информации о том же самом репаке переводился в зависимости от выбранного языка? »

Когда ты наконец прочитаешь долбаную справку? всё это описано в разделе [Languages]. Дальше по таким вопросам отвечать не буду!
К тому же этот вопрос уже задавался, юзай пожалуйста поиск перед тем как спрашивать!
Я б сейчас не наезжал, но такие вопросы с твоей стороны задаются слишком часто

vint56 30-06-2013 16:16 2176836

Вот еще один пример только теперь для Лицензии
[Languages]
Name: Russian; MessagesFile: "compiler:Languages\Russian.isl"; LicenseFile: "InfoRu.rtf";
Name: English; MessagesFile: "compiler:Languages\English.isl"; LicenseFile: "InfoEn.rtf";

saurn 30-06-2013 16:17 2176838

Цитата:

Цитата habib2302
т.е ты имеешь виду перевести info.rtf »

читать дальше »
Ага, именно это имею ввиду, и не только. Эти вопросы подробно описаны в справке, сотни раз пережеванны на форумах и есть в стандартных примерах. Большинство ответов у вас под рукой. Я начал свое знакомство с Inno с разбора буржуйских каракулей в справке и анализа коробочных примеров. Советую вам поступить так же - большинство вопросов отпадут сами, да и кругозор расширится. Дело не в том, что кто-то не хочет вам помогать, но в том, что порой совсем не хочется тратить время, на объяснение азов, человеку, который не впервый раз открыл Inno Setup. В названии данного форума нет слов "Сделайте за меня", здесь лишь помогают, на безвоздмездной основе, по мере своих возможностей. И помогут, если вы не будете каждый раз задавать вопросы, ответы на которые вам были даны ранее.

habib2302 30-06-2013 17:55 2176877

Цитата:

Цитата saurn
Цитата:

Цитата habib2302
переводился в зависимости от выбраного языка»

Как обычно самым простым способом, при помощи секции CustomMessages
Код:

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

[CustomMessages]
Russian.MsgUnins=Текст сообщения на русском
English.MsgUnins=Текст сообщения на буржуйском

»

не работает.как было

так и осталось!!!

saurn 30-06-2013 18:29 2176898

Цитата:

Цитата habib2302
не работает »

И не будет, если просто воткнуть строчки в скрипт и ждать, что они сами волшебным образом пропишутся везде, где нужно))
читать дальше »
Код:

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

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

[CustomMessages]
Russian.MsgUnins=Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?
English.MsgUnins=Before installation it is necessary to remove the previous version of the app. Continue?

Russian.Failed=Удаление завершилось неудачей. Бывай!
English.Failed=Removal came to the end with failure. Happen!

[code]
function UninstallMyApp(): Boolean;
var
   
Buff: String;
    i: Integer;
begin
   
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
    if not Result then Result := not FileExists(RemoveQuotes(Buff));
    if not Result then if MsgBox(CustomMessage('MsgUnins'), mbError, MB_YESNO) = IDYES then
    try
       
Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
    finally
       
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
        if not Result then MsgBox(CustomMessage('Failed'), mbError, MB_OK);
    end;
end;



function InitializeSetup(): Boolean;
begin
   
Result := UninstallMyApp();
end;


saurn 01-07-2013 15:08 2177372

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

Dinvin4ester 01-07-2013 15:35 2177391

Ребята сильно не пинайте, но у меня опять возник вопрос - имею вот такое
Код:

[Files]
Source: iconka.ico; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: InstallFiles\*; Flags: dontcopy
Source: "E:\Приколы\Игры\Flaming Ball\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdir

Вот эта папка - InstallFiles ставится вместе с игрой . Не подскажите как убрать ?

saurn 01-07-2013 16:01 2177424

Dinvin4ester
Код:

Source: InstallFiles\*; DestDir: {tmp}; Flags: deleteafterinstall;
Хотя она и с флагом dontcopy не должна копироватся в папку установки...

vint56 01-07-2013 16:12 2177432

Dinvin4ester
Source: InstallFiles\*; Flags: dontcopy
это временные файлы установщика они не как не могут устанавливаться в app каталог

Johny777 01-07-2013 16:46 2177450

saurn,
Цитата:

Цитата saurn
вариант с таймером оказался не жизнеспособен: память утекает, как в трубу. »

Вот код. Что с работающим таймером, что без под конец установки процесс занимает 2700+ кб. Дело не в таймере:
Под себя при создании он берёт 1 раз 14 кб
читать дальше »
Код:

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



[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external
Source: {fonts}\*; DestDir: {app}; Flags: external
Source: {fonts}\*; DestDir: {app}; Flags: external

[code  ]
type
   
TFNTimerProc = Longint;
   
const
   
TIMER_ID = 777;

function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; lpTimerFunc: TFNTimerProc): UINT; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; external 'KillTimer@user32.dll stdcall';



procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
   
WizardForm.CancelButton.Enabled := FileExists('C:\msdia80.dll');
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall: SetTimer(WizardForm.Handle, TIMER_ID, 30, CallbackAddr('TimerProc'));

        ssPreInstall: KillTimer(WizardForm.Handle, TIMER_ID);
    end;
end;


procedure DeinitializeSetup();
begin
   
KillTimer(WizardForm.Handle, TIMER_ID);
end;


И я не знаю какой таймер ты используешь. Я стандартным TTimer-м не пользуюсь :)
Кстати есть ещё высокоскоростной таймер MMTimer (мультимедийный), который работает в отдельном потоке без задержки, но он в твоём случае думаю неуместен

saurn 01-07-2013 16:50 2177455

Johny777, спасибо. Дело было именно в таймере, просто я реализовал его не верно.Точнее не так.
читать дальше »
Код:

procedure Timer(Sender: TObject);
        begin
        ...
        end;
       
        ...
        Timer := TTimer.Create(nil);
        with Timer do
        begin
            Enabled := True;
            Interval := 5;
            OnTimer := @Timer;
        end;
        ...


Вот, как раз стандартный TTimer я и пользовал))

UPD:
А виноват действительно был не таймер. Нашел причину утечки памяти.

Dinvin4ester 01-07-2013 19:41 2177556

Теперь такая ошибка - http://i46.fastpic.ru/big/2013/0701/...6ebac13f77.png
сам архив - http://sendfile.su/833359 . В том то и дело что вместе с игрой устанавливаются папки , но в них ничего нет .

saurn 01-07-2013 20:29 2177581

Dinvin4ester, смотрим на вашу секцию файлов и что мы там видим:
Код:

[Files]
Source: iconka.ico; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "InstallFiles\*"; Flags: DontCopy;
Source: "E:\Приколы\Игры\Flaming Ball\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: Slides\*; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Slides\1.jpg; DestDir: {tmp}; Flags: dontcopy
Source: InstallFiles\isSlideShow.dll; DestDir: {tmp}; Flags: dontcopy
Source: InstallFiles\InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: InstallFiles\WizardImage.jpg; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: InstallFiles\botva2.dll; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: InstallFiles\ProgressBackground.png; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: InstallFiles\ProgressImg.png; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: InstallFiles\Button.png; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: InstallFiles\Tiger.cjstyles; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: InstallFiles\ISSkin.dll; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: InstallFiles\InnoCallback.dll; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system

Эти файлы копируются в папку установки, потому что они дальше по скрипту используются деинсталятором, а папка пустая, потому что у файлов атрибут "Скрытый"

Dinvin4ester 01-07-2013 20:34 2177584

saurn,
Получается не убрать это ?

saurn 01-07-2013 20:38 2177589

Цитата:

Цитата Dinvin4ester
Получается не убрать это ? »

Ну почему же, можно запихнуть все файлы в ексишник, то есть в ресурсы, но особой нужды в этом нет. Это не является ошибкой, просто папка содержит файлы, необходимые для работы деинстала. Добавьте в скрипт вот это:
Код:

[Dirs]
Name: {app}\InstallFiles; attribs: hidden; Flags: uninsalwaysuninstall

И папка не будет мозолить вам глаза.

Dinvin4ester 01-07-2013 21:07 2177610

saurn,
Благодарю , все получилось .

Dinvin4ester 02-07-2013 12:58 2177974

Ребята, помогите убрать эффекты в слайдшоу и если не сложно сказать, что за чёрная полоса торчит в последнем окне инсталлятора - http://i46.fastpic.ru/big/2013/0702/...a65deeb16b.png
Сам скрипт= http://sendfile.su/833659 .
Заранее спасибо .

saurn 02-07-2013 13:57 2178019

Цитата:

Цитата Dinvin4ester
Ребята, помогите убрать эффекты в слайдшоу »

Строка 571 в скрипте, булевное значение True замените на False
Код:

InitializeSlideShow(BackgroundForm.Handle, 0, 0, GetSystemMetrics(0), GetSystemMetrics(1), False, 1);
На счет черной полосы: это может быть пустой лейбл(скорее всего), контрол, который забыли спрятать или еще что. Нужен скрипт с минимальным набором файлов.

vint56 02-07-2013 16:03 2178113

Dinvin4ester я и могу ошибаться
мне кажется LabelTime3 не скрыт он скрыт при ошибке а не скрыт при нормальной установки
wpFinished:эти там есть
begin
LabelTime3.Hide; добавь это

Dinvin4ester 03-07-2013 08:29 2178461

saurn,
Вот скрипт с установочным файлом - http://sendfile.su/834007
Эффект "растворения" в слайдшоу еще можно как-то прописать ? И если не сложно вы ранее мне давали как прописать на рус и т.д , так вот посмотрите правильно прописал , а то у меня не русифицирует,но переписывает файлы куда надо,да и просто, видать, версии не совпадают.Мне именно важно знать, в таблетках, русике, озвучках флаги какие должны быть.

Crazy Noise 03-07-2013 14:37 2178653

Имеется скрипт
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

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


[Icons]
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent


[Code]
var
  NewButton1: TNewButton;
  ResultCode: Integer;

procedure NewButton1Click(Sender: TObject); forward;
procedure NewButton1Click(Sender: TObject);
begin
  Exec(ExpandConstant('{src}\setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
end;

procedure InitializeWizard();
begin
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Parent := WizardForm;
    Left := ScaleX(16);
    Top := ScaleY(327);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'NewButton1';
    OnClick := @NewButton1Click;
  end;

  NewButton1.TabOrder := 5;
end;



Вопрос первый:
Как прописать команду выполнения
читать дальше »
Код:

netsh.exe wlan set hostednetwork mode=allow ssid="Home" key="12345678" keyUsage=persistent
в
Код:

Exec(ExpandConstant('{src}\setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
?


Второй вопрос:
Можно ли как-то
эту секцию кода
читать дальше »
Код:

procedure NewButton1Click(Sender: TObject);
begin
  Exec(ExpandConstant('{src}\setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
end;


запускать по кнопке через [Run]?

Mailchik 03-07-2013 15:27 2178680

Crazy Noise,
1.
читать дальше »
Код:

Exec('netsh.exe', 'wlan set hostednetwork mode=allow ssid="Home" key="12345678" keyUsage=persistent', '', SW_SHOW, ewNoWait, ResultCode)

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

[Run]
Filename: "netsh.exe"; Parameters: "wlan set hostednetwork mode=allow ssid=""Home"" key=""12345678"" keyUsage=persistent"; Flags: nowait;


habib2302 03-07-2013 16:24 2178721

подскажите мне как сделать чтобы инсталлятор создавал ветку реестра с ковычками.т.е
было так C:\Program Files (x86)\Universal Share Downloader\USDownloader.exe
а стало так "C:\Program Files (x86)\Universal Share Downloader\USDownloader.exe"

saurn 03-07-2013 17:10 2178757

Цитата:

Цитата habib2302
подскажите мне как сделать чтобы инсталлятор создавал ветку реестра с ковычками »

Код:

Root: HKLM; Subkey: SOFTWARE\My Program; ValueName: Path; ValueType: String; ValueData: """{app}"""; Flags: uninsdeletekey;

Crazy Noise 04-07-2013 10:48 2179099

Цитата:

Цитата Mailchik
2.
читать дальше » »

Я имел ввиду [Run] привязать к
читать дальше »
Код:

begin
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Parent := WizardForm;
    Left := ScaleX(16);
    Top := ScaleY(327);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'NewButton1';
    OnClick := @NewButton1Click;
  end;


возможно ли?

Dinvin4ester 05-07-2013 18:03 2179883

А мне не поможете ?

habib2302 05-07-2013 19:11 2179905

помогите решить одну проблему.короче. есть прога Universal Share Downloader 1.3.5.9 и как сделать чтобы программа запускалась вместе с windows свернуто

saurn 05-07-2013 23:30 2180065

habib2302,
Цитата:

Цитата El Sanchez
Внимание! Данная тема предназначена только для обсуждения написания скриптов ! »

-----------------------------------------------------
Цитата:

Цитата Dinvin4ester
Эффект "растворения" в слайдшоу еще можно как-то прописать ? »

Эффекты настраиваются в процедуре ShowImage
читать дальше »
Код:

ShowImage(piclist.strings[CurrentPicture - 1], 1);
Последняя циферка, выделенная жирным, в строке номер эффекта перехода.

Список возможных значений:

1 - Случайный эффект.
2 - Alpha Blend.
3 - Blocks.
4 - Circle.
5 - Diagonal.
6 - Fuse.
7 - InterLaced.
8 - Page.
9 - Radial.
10 - Roll.
11 - Waterfall.
12 - Wipe.


Меняйте номера эффектов в процедуре и выбирайте, какой вам понравится.


Цитата:

Цитата Dinvin4ester
а то у меня не русифицирует,но переписывает файлы куда надо »

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

Johny777 06-07-2013 16:09 2180329

Crazy Noise, saurn,
Цитата:

Цитата saurn
Меняйте номера эффектов в процедуре и выбирайте, какой вам понравится. »

можно ещё и рандомом ShowImage(piclist.strings[CurrentPicture - 1], Random(12)+1);


Кстати вот имплементация из делфи функции RandG() на основе нормального распределения по Гауссу

Работает она медленнее (особенно в инно), но разброс в диапазоне намного "случайнее". Кому надо забирайте! :)
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
InfoBeforeFile=compiler:license.txt
DisableWelcomePage=yes



[Code  ]
function Rand(): Extended;
begin
   
Result := Random(MAXINT)/MAXINT;
end;

function Sqr(const E: Extended): Extended;
begin
   
Result := E*E;
end;

procedure Inc(var Int: Integer);
begin
   
Int := Int+1;
end;

function Ln(const X: Extended): Extended;
var
   
tek, rez, b: Extended;
    i : Longint;
begin
   
rez := 0;
    b := X-1;
    i := 1;
    tek := b;
    while ABS(tek) >= 0.00000001 do
    begin
       
rez := rez + tek;
        Inc(i);
        b := -b*(x-1);
        tek := b/i;
    end;
    Result := rez;
end;

//Функция генерирует случайное число с отклонением по Гауссу от среднего значения Mean. Наибольшая часть возвращаемых значений будет лежать в диапазоне Mean-StdDev ... Mean+StdDev.
function RandG(const Mean, StdDev: Extended): Extended;
{ Marsaglia-Bray algorithm }
var
   
U1, S2: Extended;
begin
    repeat
       
U1 := 2*Rand() - 1;
        S2 := Sqr(U1) + Sqr(2*Rand()-1);
    until S2 < 1;
    Result := Sqrt(-2*Ln(S2)/S2) * U1 * StdDev + Mean;
end;


function RandEx(const Range: Extended): Extended;  //X := RandG(100,10); { 90<=X<=110 }
begin
   

    Result := Abs(RandG(Range/2, Range/2));
    if Result > Range then
    repeat
       
Result := Result-1;
    until Result <= Range;
end;



procedure InitializeWizard();
var
   
i: Integer;
begin
   
WizardForm.InfoBeforeMemo.Clear;
    WizardForm.InfoBeforeMemo.Text := 'RandEx' + #9#9#9 + 'Random';
    Randomize();
    for i := 0 to 20 do WizardForm.InfoBeforeMemo.Text := WizardForm.InfoBeforeMemo.Text + #13#10 + IntToStr(Round(RandEx(12))) + #9#9#9 + IntToStr(Random(12)+1);
end;


habib2302 06-07-2013 19:38 2180401

как сделать фон BeveledLabel прозрачным

saurn 06-07-2013 19:52 2180407

Цитата:

Цитата habib2302
как сделать фон BeveledLabel »

Это TNewStaticText у этих контролов есть свойство прозрачности в юникодовой версии Inno, в Ansi версии нет.

insombia 07-07-2013 17:25 2180744

http://rghost.ru/47250682 при наведении на таксбар видно черную полосу,как её убрать?
http://i48.fastpic.ru/big/2013/0706/...a6c6d72872.jpg

habib2302 07-07-2013 19:09 2180796

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

alert30 07-07-2013 19:46 2180819

insombia, это у самого Windows 7 не так.

saurn 07-07-2013 22:26 2180894

Цитата:

Цитата Crazy Noise
Я имел ввиду [Run] привязать к »

Секция [Run] выполняется только после завершения установки. Чем Exec не устраивает?

habib2302 07-07-2013 22:39 2180905

Цитата:

Цитата alert30
Windows 7 не так. »

в каком смысле не так?у меня просто тоже самое,но винда недавно установленнаяя!!

доброе время суток.Я решил вернутся к моему сообщению по поводу appid с фигурными скобками {}
Цитата:

Цитата habib2302
Код:

RegQueryStringValue(HKLM, Format('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%s_is1', [AppIds[i]]), 'UninstallString', Buff);
Buff := RemoveQuotes(Buff);

появились еще проблемы.
после удаления моего репака выдает ошибку

»

сейчас делаю репак image comparer.оригинальный экзешник был создан через инно.т.е нету гемороя с _is1 на конце appid.но я хочу решить эту проблему

habib2302 08-07-2013 10:20 2181046

прошу мой скрипт

insombia 08-07-2013 10:38 2181065

не нашел тему для пережатия файлов и т д по этому пишу здесь,кому нужно вышла новая версия SrepInside v0.3.1
поддержка распаковки архивов последней версии srep v3.91;
убрал проверку контрольной суммы, т.к. фриарк при распаковке сам ее проверяет.

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

habib2302 08-07-2013 10:51 2181083

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

habib2302 08-07-2013 11:15 2181110

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

saurn 08-07-2013 11:18 2181113

habib2302, держите
Секция кода
Код:

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

const
   
RT_RCDATA            = 10;
    APPID_IMAGE_COMPARER  = '%7B{D37E8E49-1AA3-401F-BA15-50AB88A2712D}';
    WAIT_OBJECT_0        = $0;
    STARTF_USESHOWWINDOW  = 1;
    NORMAL_PRIORITY_CLASS = $00000020;
    INFINITE              = $FFFFFFFF;

type
   
_STARTUPINFO = record
       
cb: DWORD;
        #ifdef UNICODE
           
lpReserved, lpDesktop, lpTitle: PAnsiChar;
        #else
           
lpReserved, lpDesktop, lpTitle: PChar;
        #endif
       
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
        wShowWindow, cbReserved2: Word;
        lpReserved2: Byte;
        hStdInput, hStdOutput, hStdError: THandle;
    end;

    _PROCESS_INFORMATION = record
       
hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
    end;

function SetWindowTheme(hwnd: HWND; pszSubAppName: pchar; pszSubIdList: pchar): Longint; external 'SetWindowTheme@uxtheme.dll stdcall delayload';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif

var
 
TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;
 ResultCode: Integer;
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
 CheckLicense: TCheckBox;
 iInitialize: Boolean;
 TB: TTrackBar;

function GetUninstallPath(const AppIds: array of String): array of String;
var
   
StringList: TStringList;
    i, Len: Integer;
    Buff: String;
begin
    for
i := 0 to GetArrayLength(AppIds)-1 do
    begin
       
Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
        if Buff <> '' then
        begin
           
Len := GetArrayLength(Result);
            SetArrayLength(Result, Len+1);
            Result[Len] := Buff;
        end;
    end;
end;


procedure UninstallApps(const UninstallPathes: array of String);
var
   
pi: _PROCESS_INFORMATION;
    si: _STARTUPINFO;
    i: Integer;
begin
    for
i := 0 to GetArrayLength(UninstallPathes)-1 do
    begin
       
si.cb := SizeOf(si);
        si.dwFlags := STARTF_USESHOWWINDOW;
        si.wShowWindow := SW_SHOWNORMAL;
        #ifdef UNICODE
       
if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
       
#else
       
if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
       
#endif
       
begin
           
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
            Exit;
        end;
        try
            while
WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
        finally
           
CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        end;
    end;
end;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
 
lResStream: TResourceStream;
begin
 
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
   
lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
 
lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

//////////////////////////////////кликабельный лейбл
procedure BevelLabelClick(Sender: TObject);
 var ErrorCode: Integer;
 begin
 
ShellExec('open','http://forum.oszone.net/member.php?u=334581','', '', SW_SHOW, ewNoWait, ErrorCode)
 end;
///////////////////////////////////////

function InitializeSetup(): Boolean;
var
   
i, Len: Integer;
    uArray: array of String;
begin
   
uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_IMAGE_COMPARER] );
    Len := GetArrayLength(uArray);
    Result := Len = 0;
    if not Result then if MsgBox(CustomMessage('MsgUnins'), mbError, MB_YESNO) = IDYES then
    begin
       
UninstallApps(uArray);
        Result := InitializeSetup();
    end;
end;

procedure LogoLabelOnClick(Sender: TObject);
begin
 
ShellExec('open', 'http://www.imagecomparer.com/', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode)
end;

procedure LicenseOnClick(Sender: TObject);
begin
  case
TCheckBox(Sender).Checked of
   
True: WizardForm.LicenseAcceptedRadio.Checked := True;
    False: WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;

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

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

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
  if
WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure TBOnChange(Sender: TObject);
begin
 
SetTaskBarProgressValue(0, TTrackBar(sender).Position);
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;
  with WizardForm do
  begin
   
iInitialize := True;
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
     
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(135), ScaleY(38), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

    ExtractTemporaryFile('WinTB.dll');
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
    TB:=TTrackBar.Create(Wizardform)

    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(nil);
    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;
    with TLabel.Create(WizardForm) do
    begin
     
Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(135), ScaleY(38));
      OnClick:=@LogoLabelOnClick;
      Cursor:= CrHand;
/////////////////////////////////////кликабельный лейбл
 
with BeveledLabel do
  begin
 
OnClick:=@BevelLabelClick;
 Font.Color:=clBlue;
 Enabled:=True;
 Cursor:=crHand;
 end;
 end;
 end;
 ///////////////////////////////////////
 
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case
CurPageID of
   
wpSelectTasks:
  begin
   
WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  if
iInitialize then
  begin
   
gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure UnLogoLabelOnClick(Sender: TObject);
begin
 
ShellExec('open', 'http://www.imagecomparer.com/', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode)
end;

procedure InitializeUninstallProgressForm;
begin
  with
UninstallProgressForm do
    begin
      if
GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
       
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(135), ScaleY(38), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
     
Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(320), ScaleX(135), ScaleY(38));
      OnClick:=@UnLogoLabelOnClick;
      Cursor:= CrHand;
/////////////////////////////////////кликабельный лейбл
 
with BeveledLabel do
  begin
 
OnClick:=@BevelLabelClick;
 Font.Color:=clBlue;
 Enabled:=True;
 Cursor:=crHand;
 end;
 end;
 end;
 ///////////////////////////////////////
 
end;

procedure DeinitializeUninstall();
begin
 
gdipShutdown;
end;


Dinvin4ester 08-07-2013 21:44 2181557

saurn,
Спасибо еще раз . Все получилось .

Bioto 09-07-2013 02:21 2181644

Приветствую!

1. Как в инсталлятор встроить рекламу от Google Adsense? И разрешено ли это гуглом? Если нет, так как встроить свои баннеры?

2. Как можно подсчитать количество установок? Например, можно было бы отправлять по окончании успешной установки get/post запрос на свой сайт. И желательно с ip-адресом, чтобы можно было считать уникальное число. Как можно это реализовать? Интересует отправка, так как на php я уже сам приму. И что скажут по этому поводу антивирусы?

habib2302 09-07-2013 09:48 2181715

Цитата:

Цитата Bioto
1. Как в инсталлятор встроить рекламу от Google Adsense? »

тебе заняться нечем???

Gnom_aka_Lexander 09-07-2013 18:14 2182025

Цитата:

Цитата habib2302
тебе заняться нечем??? »

Оффтоп, не находишь? Задача в наше время довольно частая, сам делал человеку инсталл по партнерке с яндексом, за который он так и не заплатил. но это так, раз уж пошел оффтоп, если удалят - не обижусь.
Цитата:

Цитата Bioto
Как в инсталлятор встроить рекламу от Google Adsense? »

Есть море способов. Нужно знать, как оно должно выглядеть? Возможности инно - от открытия браузера по нажатию на активный элемент, до браузера встроенного прямо в инсталл.
Цитата:

Цитата Bioto
Как можно подсчитать количество установок? »

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

El Sanchez 09-07-2013 18:26 2182030

Цитата:

Цитата Bioto
1. Как в инсталлятор встроить рекламу от Google Adsense? И разрешено ли это гуглом? »

Bioto, не разрешено
Цитата:

Цитата Bioto
Если нет, так как встроить свои баннеры? »

Bioto, если статический, то обычная картинка (может и кликабельная). Если динамический, то gif, какой-нибудь.
Цитата:

Цитата Bioto
И желательно с ip-адресом, чтобы можно было считать уникальное число »

Bioto, а если несколько пользователей одной сети с общим IP установят, то считать за одну установку? А если удалил и поставил заново?
Цитата:

Цитата Bioto
И что скажут по этому поводу антивирусы? »

Bioto, параноики обнаружат подозрительную сетевую активность.

Gnom_aka_Lexander 09-07-2013 18:34 2182037

Цитата:

Цитата El Sanchez
параноики »

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

Цитата:

Цитата El Sanchez
а если несколько пользователей одной сети с общим IP установят, то считать за одну установку? »

куки, мак, етк
Цитата:

Цитата El Sanchez
А если удалил и поставил заново? »

для того и нужно вроде. Человеку нужен именно подсчет количества установок. Если подружить решение с файрволом и антивирем, то решение в принципе сложностей не вызовет.
Цитата:

Цитата Bioto
на php я уже сам приму »

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

Serega 09-07-2013 20:12 2182072

Всем привет :hi:
Цитата:

Цитата Bioto
1. Как в инсталлятор встроить рекламу от Google Adsense? »

Встроить не проблема... главное авторские права соблюсти.
Цитата:

Цитата Bioto
как встроить свои баннеры? »

вариантов масса, весь вопрос в том, что вы хотите увидеть...
Цитата:

Цитата Bioto
2. Как можно подсчитать количество установок? »

Вопрос более риторический... как сказал El Sanchez:
Цитата:

Цитата El Sanchez
а если несколько пользователей одной сети с общим IP установят, то считать за одну установку? А если удалил и поставил заново? »

Здесь только нужно привязываться к железу и в конечном итоге вы увидите количество оригинальных установок.
Цитата:

Цитата Bioto
И что скажут по этому поводу антивирусы? »

Антивирусы пишут люди, впрочем как и вирусы... поверьте get/post это последнее о чём стоит беспокоится в решении вашего вопроса.

insombia 09-07-2013 23:42 2182161

del

Bioto 11-07-2013 00:36 2182844

Цитата:

Цитата El Sanchez
Bioto, а если несколько пользователей одной сети с общим IP установят, то считать за одну установку? А если удалил и поставил заново? »

Я думаю это не проблема программы, главное сделать факт установки и записывать все на сайт в базу MySQL, например. Просто лог установок, а как уже считать количество уникальных посетить это другое дело. Ну cookie еще можно поставить.

insombia 12-07-2013 23:44 2183991

http://i47.fastpic.ru/big/2013/0712/...c10fa57e8c.jpg как убрать белую обводку вокруг кнопок?

El Sanchez 14-07-2013 11:42 2184424

Цитата:

Цитата insombia
как убрать белую обводку вокруг кнопок? »

insombia, в данном случае родитель кнопки имеет сплошной цвет, поэтому верни для кнопки кисть нужного цвета, например, WizardForm.Brush.Color := clRed. В случае, если на родителе картинка, нужно создать на ее основе узорчастую кисть, сабклассить кнопку или ее родителя и в сообщении CN_CTLCOLORBTN (если сабклассить кнопку) или WM_CTLCOLORBTN (если сабклассить родителя) вернуть кисть с необходимым смещением. Пример:
читать дальше »

Код:

[Setup]
AppName=test
AppVerName=test
CreateAppDir=false
DefaultDirName={tmp}
Uninstallable=false
BitmapResource=bgnd:{app}\robots.bmp

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

[code]
#define A = (Defined UNICODE) ? "W" : "A"

const
   
CN_CTLCOLORBTN = $BD35;
    GA_ROOT = 2;
    GWL_WNDPROC = (-4);
    GWL_USERDATA = (-21);

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CreatePatternBrush(hbmp: HBITMAP): Longint; external 'CreatePatternBrush@gdi32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';
function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints: TPoint; cPoints: UINT): Integer; external 'MapWindowPoints@user32.dll stdcall';
function SetBrushOrgEx(hdc: Longint; nXOrg, nYOrg: Integer; var lppt: TPoint): BOOL; external 'SetBrushOrgEx@gdi32.dll stdcall';
function GetAncestor(hwnd: HWND; gaFlags: UINT): HWND; external 'GetAncestor@user32.dll stdcall';

var
   
g_Bgnd: TBitmapImage;
    g_hBrush: Longint;

/////////////////////////////////////////////////////////////////////////////
function ButtonProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
var
   
pt: TPoint;
begin
    case
Msg of
       
CN_CTLCOLORBTN: begin
           
MapWindowPoints(hWnd, GetAncestor(hWnd, GA_ROOT), pt, 1);
            SetBrushOrgEx(wParam, -pt.x, -pt.y, pt);
            Result := g_hBrush;
        end;
    else
       
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
    with
WizardForm do
    begin
       
WizardBitmapImage.Hide;
        Bevel.Hide;
        OuterNotebook.Hide;
    end;
    // background
   
g_Bgnd := TBitmapImage.Create(WizardForm);
    with g_Bgnd do
    begin
       
Parent := WizardForm;
        Align := alClient;
        Bitmap.LoadFromResourceName(HInstance, '_IS_BGND');
        g_hBrush := CreatePatternBrush(Bitmap.Handle);
    end;
    // subclass button
   
with WizardForm.NextButton do SetWindowLong(Handle, GWL_USERDATA, SetWindowLong(Handle, GWL_WNDPROC, CallbackAddr('ButtonProc')));
end;

procedure DeinitializeSetup();
begin
    with
WizardForm.NextButton do if GetWindowLong(Handle, GWL_USERDATA) > 0 then SetWindowLong(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_USERDATA));
end;


Gnom_aka_Lexander 14-07-2013 11:45 2184427

Цитата:

Цитата El Sanchez
если сабклассить кнопку »

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

El Sanchez 14-07-2013 14:02 2184477

Цитата:

Цитата Gnom_aka_Lexander
Позволю себе уточнить. насколько я помню (ибо как-то бился в истерике над этим вопросом) событие WM_CTLCOLOR обрабатывается исключительно родителем.
если еще точнее - главным окном приложения. »

Приходит родителю. Родителем кнопки NextButton является WizardForm (сообщение приходит форме), родителем DirBrowseButton - SelectDirPage (сообщение приходит нотебуку)

Цитата:

Цитата Gnom_aka_Lexander
А вообще просто переход на юникодную версию инно легко решает этот вопрос без дополнительных усилий. правда тогда наверняка часть скрипта придется переписывать. если не весь. »

Например?

Цитата:

Цитата Gnom_aka_Lexander
Еще один гемор в этом направлении. WM_CTLCOLOR довольно криво работает с XP манифестом. »

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

Gnom_aka_Lexander 14-07-2013 14:14 2184489

Цитата:

Цитата El Sanchez
Например? »

Ссылка Никакой рекламы, только для примера. тем более есть в шапке соседней темы.

El Sanchez 14-07-2013 14:55 2184506

Gnom_aka_Lexander, ясно, в юникодной версии фон дочернего окна закрашивается кистью родительского, для анси реализовывать самому.

Gnom_aka_Lexander 14-07-2013 14:59 2184510

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

insombia 14-07-2013 17:14 2184566

все было из-за темы
p.s. спасибо Gnom_aka_Lexander и El Sanchez за помощь,буду знать

saurn 14-07-2013 18:48 2184594

Немного переделал свой старый код авторана. По хорошему его бы надо целиком переделать, но, в принципе, заложенные функции выполняет правильно. Может кому сгодится.
Скачать архив
P.S.
читать дальше »
Код писался преимущественно для одной игры, но в целом вполне универсален.
Спасибо Johny777 за примеры и направления по верному пути))).

sergey3695 14-07-2013 21:16 2184649

delete/

Михаил_Печников@fb 15-07-2013 17:23 2185057

Всем, доброго!
Подскажите как бы в сетапе проверить, установлено в системе ms officсe
нужной версии.
И если нет то скачать с сайта и установить runtime версию access.


з.ы. прошу отнестись с пониманием. Поиск не рулит, курить сначала тему не реально.

El Sanchez 15-07-2013 21:10 2185181

Цитата:

Цитата Михаил_Печников@fb
проверить, установлено в системе ms officсe »

Михаил_Печников@fb, может нужно определить наличие в системе установленного Access, а не Office? Ибо наличие Office не говорит о обязательном наличии Access.

Цитата:

Цитата Михаил_Печников@fb
нужной версии »

Михаил_Печников@fb, какой? А то рантаймов несколько и разной разрядности.

Цитата:

Цитата Михаил_Печников@fb
скачать с сайта »

Михаил_Печников@fb, может лучше рядом с установщиком рантайм держать? Качать много.

ToBeLife 16-07-2013 01:31 2185300

Доброго времени суток. Помогите реализовать:
необходимо, чтобы в процессе установки копировалось содержимое компонента 1, затем запускался exe-файл, (если выбраны оба компонента) компируется содержимое компонента 2 и снова запускается тот же exe-файл. Но по умолчанию в инно, в начале скопируются файлы (содержимое) и только потом запустится секция run.
файл 1 - запуск exe - файл 2 - запуск exe
Возможно я не вижу элементарного, подскажите, как это реализовать.

saurn 16-07-2013 02:46 2185315

Цитата:

Цитата ToBeLife
Но по умолчанию в инно, в начале скопируются файлы (содержимое) и только потом запустится секция run.
файл 1 - запуск exe - файл 2 - запуск exe »

Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=none


[Components]
Name: a; Description: Компонент 1; Types: full
Name: b; Description: Компонент 2; Types: custom


[Files]
;Компонент 1
Source: c:\windows\fonts\*; DestDir: {app}; Components: a; Flags: ignoreversion external;
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Afterinstall: My_Exec(1); Components: a; Flags: ignoreversion;
;Компонент 2
Source: c:\windows\help\*; DestDir: {app}; Components: b; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion external;
Source: compiler:Examples\MyProg.exe; DestDir: {app}; DestName: MyProg2.exe; Afterinstall: My_Exec(2); Components: b; Flags: ignoreversion;


[Code]
procedure My_Exec(const Number: Integer);
var
   
i: Integer;
begin
    case
Number of
       
1: Exec(ExpandConstant('{app}\MyProg.exe'), '', ExpandConstant('{app}'), 5, ewWaitUntilTerminated, i);  //Ексишник первого компонента с ожиданием
       
2: Exec(ExpandConstant('{app}\MyProg2.exe'), '', ExpandConstant('{app}'), 5, ewWaitUntilTerminated, i);  //Ексишник второго компонента с ожиданием
   
end;
end;


saurn 17-07-2013 19:05 2186170

Всем привет :hi: Есть ли возможность вывести в кастомный лейбл имена копируемых файлов(не полный путь, а имя конечной папки и текущего копируемого файла), когда для них установлен флаг external? CurrentFileName, ExtractFileDir, ExtractRelativePath в данном случае не работают.

Johny777 17-07-2013 21:28 2186232

saurn, Так можно:
читать дальше »

Код:



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


[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external;



[Code  ]
#define A = (Defined UNICODE) ? "W" : "A"

const
   
GWL_WNDPROC = -4;
    WM_PAINT = $000F;


type
   
WPARAM = Integer;
    LPARAM = Integer;
    LRESULT = Integer;
    TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';

var
 
OldStaticProcAddr: Longint;


function StaticWindowdProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
   
BuffPath: String;
begin
    if
Msg = WM_PAINT then
    begin
       
BuffPath := WizardForm.FilenameLabel.Caption;
        WizardForm.Caption := ExtractFilePath(BuffPath) + #32#32 + ExtractFileName(BuffPath);
    end;

    Result:= CallWindowProc(OldStaticProcAddr, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
   
WizardForm.FilenameLabel.Width := WizardForm.FilenameLabel.Width * 7;
    WizardForm.Width := 1400;
    OldStaticProcAddr := SetWindowLong(WizardForm.FilenameLabel.Handle, GWL_WNDPROC, CallbackAddr('StaticWindowdProc'));
end;

procedure DeinitializeSetup();
begin
   
SetWindowlong(WizardForm.FilenameLabel.Handle, GWL_WNDPROC, OldStaticProcAddr);
end;




Только вот инно по дефолту укорачивает длинный путь многоточием, чтоб уместить в длину статик текста. Решение - удлинить статик текст.
Для примера отображаю всё в заголовке формы

PS: как вариант копировать через код. Если решение выше не устраивает - говори. Будем делать через код
Максимальный путь в винде равен 260 (+1) символов

Fakt_37 17-07-2013 21:44 2186241

Доброе время суток, подскажите пожалуйста, сделал рекомпрессию прекомпом, в батнике написал Precomp041.exe - slow -c- "название файла", но распаковка потом не идёт, выдаёт ошибку запуска концольного приложения Precomp041, в чём проблема?

saurn 17-07-2013 21:45 2186242

Johny777, благодарю. Да я обратился к этой теме скорее для повышения кругозора, чем из необходимости. Inno своими средствами выводит имена файлов, просто я обрезал строку FileNameLabel, чтобы отображалась только последняя папка и имя копируемого файла, и когда начинается копирование внешних файлов строка получается пустой.
-----------------------------------------------------------------
UPD
Твой способ, как раз то, что нужно. Лишь исправил немножко на:
Код:

BuffPath := WizardForm.FilenameLabel.Caption;
WizardForm.Caption := ExtractRelativePath(ExtractFileDir(BuffPath), BuffPath);

Спасибо :)
-----------------------------------------------------------------
Fakt_37, оффтоп
Цитата:

Цитата El Sanchez
Внимание! Данная тема предназначена только для обсуждения написания скриптов ! »


Johny777 17-07-2013 22:11 2186256

saurn,
Цитата:

Цитата saurn
только последняя папка »

пардон (не сделал в перд. коде), имя последней папки пути (путь без имени файла на конце) получаешь так:

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

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


[code  ]
function GetLastPathFolderName(const UndefPath: String): String;
var
   
Len, i: Integer;
    BuffStr: String;
begin
   
BuffStr := RemoveBackslash(UndefPath);
    Len := Length(BuffStr);
    for i := Len downto 1 do
    begin
        if
BuffStr[i] = '\' then Break;
        Result := Result + BuffStr[i];
    end;
   
    BuffStr := Result;
    Result := '';
    Len := Length(BuffStr);
    for i := Len downto 1 do Result := Result + BuffStr[i];
end;


procedure InitializeWizard();
begin
   
MsgBox(GetLastPathFolderName(WizardForm.DirEdit.Text), mbInformation, MB_OK);
end;



или так MsgBox(ExtractFileName(ExtractFileName(WizardForm.DirEdit.Text)), mbInformation, MB_OK);

PS: функция GetLastPathFolderName написана на низком уровне, работает бетонно. В Си была бы длиннее, тк нужно было бы писать вручную RemoveBackslash() и Length()
Скорость работы GetLastPathFolderName на максимальном уровне. Всё остальное зависит от компилятора и я фиг знает как написана ExtractFileName. Поэтому к ExtractFileName нет доверия

Fakt_37 17-07-2013 22:12 2186257

Цитата:

Цитата saurn
Fakt_37, оффтоп
Цитата El Sanchez:
Внимание! Данная тема предназначена только для обсуждения написания скриптов ! » »

я знаю что ключ "-slow- -c-" нужно написать в скрипт, только не знаю куда, и мой вопрос относится к вашей теме!

R.i.m.s.k.y. 17-07-2013 22:34 2186265

Необходимо простому пользователю поставить программу, требующую админские права.
Если запустить от админа - то все переменные пользователя инно определит админские, а не оригинального пользователя
Конкретно нужна папка appdata оригинального пользователя и его же HKCU
RunAsOriginalUser не решает
Как обойти грабли?

Johny777 17-07-2013 22:56 2186276

R.i.m.s.k.y., поднятие привилегий собственному процессу не поможет? пример понятия привилегий в шапке, в "закрытии процесса".
возможные привилегии:
читать дальше »
Код:

const
   
SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
    SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
    SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
    SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
    SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
    SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
    SE_TCB_NAME = 'SeTcbPrivilege';
    SE_SECURITY_NAME = 'SeSecurityPrivilege';
    SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
    SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
    SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
    SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
    SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
    SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
    SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
    SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
    SE_BACKUP_NAME = 'SeBackupPrivilege';
    SE_RESTORE_NAME = 'SeRestorePrivilege';
    SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    SE_DEBUG_NAME = 'SeDebugPrivilege';
    SE_AUDIT_NAME = 'SeAuditPrivilege';
    SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
    SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
    SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
    SE_UNDOCK_NAME = 'SeUndockPrivilege';
    SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
    SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
    SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';
    SE_IMPERSONATE_NAME = 'SeImpersonatePrivilege';
    SE_CREATE_GLOBAL_NAME = 'SeCreateGlobalPrivilege';


описание каждой привилегии: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

ай-ди своего процесса получаешь WinApi-функцией GetCurrentProcessId()
Получить иня пользователя запустившего экзешник можно http://www.delphimaster.net/view/4-1107175032 в 5-м сообщении например рабочий пример (протестировал на делфи)

R.i.m.s.k.y. 17-07-2013 23:07 2186279

Цитата:

Цитата Johny777
поднятие привилегий собственному процессу не поможет? »

может и поможет, но это применимо к самому установщику который уже запущен?
Цитата:

Цитата Johny777
Получить иня пользователя запустившего экзешник можно »

как в таком случае достучаться до HCKU и appdata?

Johny777 17-07-2013 23:22 2186281

Цитата:

Цитата R.i.m.s.k.y.
может и поможет, но это применимо к самому установщику который уже запущен? »

да, то бишь когда есть процесс (твой конечно)
поднимай например перед тем как тебе нужно выполнить действия админа. Опускай после завершения действий
Цитата:

Цитата R.i.m.s.k.y.
как в таком случае достучаться до HCKU и appdata? »

может после поднятия привилегий достучишься, но ведь HCKU - это ветка текущего пользователя. Разве проблема туда писать или читать оттуда из под текущего пользователя?

PS: Если честно я хз получится ли

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

Fakt_37, Так сойдёт?

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

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


[Files]
Source: Precomp041.exe; Flags: dontcopy nocompression;


[Run]
Description: Extracting precompiled File; Filename: {tmp}\Precomp041.exe; WorkingDir: {tmp}; Parameters: твои параметры распаковки; Check: ExtractProgramm('Precomp041.exe');


[code  ]

function ExtractProgramm(const TempFileName: String): Boolean;
begin
   
ExtractTemporaryFile(TempFileName);
    Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + TempFileName);
end;


R.i.m.s.k.y. 18-07-2013 13:32 2186569

Цитата Johny777:
PS: Если честно я хз получится ли »
не, не получается
Установщик запрашивает логин/пасс админа и все делает для него
Зачем тогда в Инно флаг runAsoriginaluser? и как этот параметр работает?
Даже если запустить свой установщик из другого с runAsoriginaluser - борода, все вносится в админский акк

mifkys 18-07-2013 17:15 2186686

Приветствую еще раз! Можно ли в Inno Setup поменять порядок выполнения секций? Нужно сначала [Run] прогнать, а потом уже [Dirs] и [Files].

Fakt_37 18-07-2013 17:20 2186691

Цитата:

Цитата Johny777
Fakt_37, Так сойдёт?
читать дальше » »

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

R.i.m.s.k.y. 18-07-2013 18:03 2186719

mifkys, нет
используй CurStepChanged/CurPageChanged

nik1967 18-07-2013 18:42 2186736

Всем доброго времени суток! Возникла необходимость средствами Inno узнать название видеоадаптера. Кто подскажет, как с помощью API в Inno это провернуть?

saurn 18-07-2013 19:10 2186750

Fakt_37, читайте в справке про секцию [Components]
Код:

[Components]
Name: rus; Description: Русская озвучка; Types: full; Falgs: exclusive
Name: eng; Description: Английская озвучка; Types: custom; Falgs: exclusive

[Files]
Source: rus\*; DestDir: {app}; Components: rus; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;
Source: eng\*; DestDir: {app}; Components: eng; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;

Цитата:

Цитата R.i.m.s.k.y.
флаг exclusive »

Точно, запамятовал)

R.i.m.s.k.y. 18-07-2013 19:15 2186754

nik1967, в шапке скрипт Ultimate Test Black Skin, в нем выдергивается не только имя адаптера, но и память, разрешение экрана...

Fakt_37 saurn, флаг exclusive

Код:

[Components]
Name: rus; Description: Русская озвучка; Types: full; Falgs: exclusive
Name: eng; Description: Английская озвучка; Types: custom; Falgs: exclusive

[Files]
Source: rus\*; DestDir: {app}; Components: rus; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;
Source: eng\*; DestDir: {app}; Components: eng; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;


Johny777 18-07-2013 20:43 2186826

nik1967, список имён видеокарт через winapi-функцию EnumDisplayDevices() :

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

#define A = (Defined UNICODE) ? "W" : "A"


const
   
DISPLAY_DEVICE_MODESPRUNED = $8000000;


type
   
_DISPLAY_DEVICE = record
       
cb: DWORD;
        #ifdef UNICODE
           
DeviceName: array[0..31] of AnsiChar;
            DeviceString: array[0..127] of AnsiChar;
        #else
           
DeviceName: array[0..31] of Char;
            DeviceString: array[0..127] of Char;
        #endif
       
StateFlags: DWORD;
    end;
   
    Pointer = Integer;
 
 
function EnumDisplayDevices(Unused: Pointer; iDevNum: DWORD; var lpDisplayDevice: _DISPLAY_DEVICE; dwFlags: DWORD): BOOL; external 'EnumDisplayDevices{#A}@user32.dll stdcall';


procedure Inc(var Int: Integer);
begin
   
Int := Int + 1;
end;


function CharArrayToString(aChar: array of Char): String;
begin
   
Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;


function InArray(const uArray: array of String; const SearchStr: String): Boolean;
var
   
i, Len: Integer;
begin
   
Len := GetArrayLength(uArray);
    if Len = 0 then Exit;
    for i := 0 to Len-1 do
    begin
       
Result := uArray[i] = SearchStr;
        if Result then Break;
    end;
end;


function GetVideoDevices(): array of String
var
   
dd: _DISPLAY_DEVICE;
    iDevNum: Integer;
    Len: Integer;
    Buff: String;
begin
   
dd.cb := SizeOf(dd);
    while EnumDisplayDevices(0, iDevNum, dd, 0) do
    begin
        if
dd.StateFlags = DISPLAY_DEVICE_MODESPRUNED then
        begin
           
Buff := CharArrayToString(dd.DeviceString);
            if not InArray(Result, Buff) then
            begin
               
Len := GetArrayLength(Result);
                SetArrayLength(Result, Len+1);
                Result[Len] := Buff;
            end;
        end;
        Inc(iDevNum);
    end;
end;


procedure InitializeWizard();
var
   
sArray: array of String;
    i: Integer;
begin
   
sArray := GetVideoDevices();
    for i := 0 to GetArrayLength(sArray)-1 do MsgBox(sArray[i], mbInformation, MB_OK);
end;



PS: с флагами запутался. http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Почему то имя одной и той же видеокарты возвращает 2 раза. Решаю этот вопрос проверкой на отсутствие имени в выходном массиве строк

R.i.m.s.k.y. 18-07-2013 22:12 2186886

Johny777 Это копипаста из шапочного ултимейт тест

Цитата:

Цитата Johny777
Почему то имя одной и той же видеокарты возвращает 2 раза.

А дублируется скорее всего потому что дрова обновлял поверх
но я делаю так
Код:

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;

Дергается не только имя, то и главное - dev&ven, по которому можно выделать классы видеоадаптеров, что намного точнее чем маркетинговые имена
И главное - в системах с оптимусом покажет не только intelHD, но и гефорц

вот тут можно узнать div видюшек
http://cateee.net/lkddb/web-lkddb/DRM_I915.html

Johny777 18-07-2013 22:18 2186890

R.i.m.s.k.y., По секрету :) Я шапочный ултимейт тест в глаза не видел. Открыл гугл и нашёл функцию
читал, что можно и из реестра дёрнуть. Только функция как-то милее :)



это сообщение пустое, и будет удалено ... потом ... мной

R.i.m.s.k.y. 18-07-2013 22:21 2186893

Johny777, а твоя/шапочная функция дернет только текущий активный адаптер, я это проходил когда в SVP делал определялку видюшки для подбора профилей
Дык и у меня функция, возвращает построчно список видюшек

Кстати вот тут можно узнать div видюшек
http://cateee.net/lkddb/web-lkddb/DRM_I915.html

да ладно, не удаляй сообщение

че-то у меня подписка на тему не работает


до кучи в шапку
GUID'ы дивайсов
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Johny777 18-07-2013 22:34 2186904

R.i.m.s.k.y., никак нет, я на ноуте сейчас. Возвращает 2 видюхи, интел и нвидию. Активный - интел

R.i.m.s.k.y. 18-07-2013 22:52 2186910

Цитата:

Цитата Johny777
никак нет, я на ноуте сейчас. Возвращает 2 видюхи, интел и нвидию. Активный - интел »

значит мой склероз мне изменил

volga163@vk 19-07-2013 00:40 2186948

Друзья, выручайте. Совсем у меня то ли с памятью, то ли с головой в целом случилось. Как можно в Inno Setup сделать текстовый логотип в верхнем левом углу установщика? Ну как здесь: (взял первое, что под руку попалось :) )

vint56 19-07-2013 01:05 2186961

volga163@vk
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
WindowVisible=true

volga163@vk 19-07-2013 01:44 2186969

vint56, Спасибо!
А ещё вот такой вопрос. Можно ли этот логотип сделать поверх фоновой картинки?
Картинка вызывается так (нашёл скрипт на просторах интернета):
читать дальше »
Код:

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('fon.bmp');
BackgroundImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\fon.bmp'));
BackgroundImage.Parent:= BackgroundForm;


Fakt_37 19-07-2013 02:33 2186980

а можно ли из одного скрипта установить сразу несколько игр? причём скрипт с автораном, знает кто как это сделать?

saurn 19-07-2013 03:19 2186989

Цитата:

Цитата Fakt_37
а можно ли из одного скрипта установить сразу несколько игр? »

Можно установить сколько угодно. Все по тому же принципу: каждая игра в качестве отдельного компонента, или все в одной куче.
Цитата:

Цитата Fakt_37
причём скрипт с автораном »

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

vint56 19-07-2013 10:29 2187085

volga163@vk
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: Fon.bmp; DestDir: {tmp}

[code]
var
BackgroundForm: TForm;
BackgroundImage: TBitmapImage;
LoGoTip: TLabel;

Procedure BackgroundOnActivate(Sender: TObject); Begin if WizardForm.Visible then WizardForm.Show End;
function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32.dll stdcall';

procedure InitializeWizard();
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('fon.bmp');
BackgroundImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\fon.bmp'));
BackgroundImage.Parent:= BackgroundForm;
LoGoTip := TLabel.Create(WizardForm);
with LoGoTip do
begin
Parent := BackgroundForm;
Font.Height := -100;
Caption := 'Мой Логотип';
Left := ScaleX(50);
Top := ScaleY(50);
Width := ScaleX(1000);
Height := ScaleY(100);
Font.Name := 'Verdana';
Font.Style := [fsBold];
end;
end;

Procedure DeinitializeSetup;
Begin
BackgroundForm.Free
End;

volga163@vk 19-07-2013 13:43 2187205

vint56, Спасибо большое, работает. Последний вопрос, можно ли сделать фон прозрачным? А то получается светлая рамка на картинке.

vint56 19-07-2013 13:48 2187210

volga163@vk может тебе сплэш нужен

читать дальше »
[Files]
Source: "Splash.png"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[code]
procedure ShowSplashScreen(p1:HWND;p2:ansistring;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure InitializeWizard;
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False, $FFFFFF,10);
end;

Fakt_37 19-07-2013 14:12 2187223

а как сделать чтоб вот эта строчка "if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-1.bin'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;" запускалась только после выбора того или иного компонента?

vint56 19-07-2013 14:27 2187238

Fakt_37 это пример из справки
читать дальше »
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed // это считается 0
Name: text\rus; Description: Русский; Flags: exclusive;// это считается 1 компонент
Name: text\eng; Description: Английский; Flags: exclusive;// это считается 2 компонент
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed // это считается 3 компонент
Name: voice\rus; Description: Русский; Flags: exclusive; // это считается 4 компонент
Name: voice\eng; Description: Английский; Flags: exclusive;// это считается 5 компонент



Comps1:=0; Comps2:=0; Comps3:=0;
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

....

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
repeat
if not FileSearchInit(false) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\BasicData.arc'), ExpandConstant('{app}\'), '', false, '', '', '', notPCFonFLY) then break; // это основной архив
if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; // это считается 1 компонент
if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; // это считается 2 компонент
if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; // это считается 3 компонент
if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; // это считается 4 компонент
ISDoneError:=false;
until true;
ISDoneStop;
end;

R.i.m.s.k.y. 19-07-2013 14:36 2187245

Цитата:

Цитата Johny777
поднятие привилегий собственному процессу не поможет? пример понятия привилегий в шапке, в "закрытии процесса".
возможные привилегии: »

я наверное что-то не так делаю,
не выскакивает окно уака/пасса
покромсал пример "закрытие процесса"
Ну и по факту видно что права как были простые так и остались
Код:

[Code]


#define A = (Defined UNICODE) ? "W" : "A"
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_VM_OPERATION = $8;
    PROCESS_VM_READ = $10;
    PROCESS_VM_WRITE = $20;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    MEM_COMMIT = $1000;
    MEM_RESERVE = $2000;
    PAGE_EXECUTE_READWRITE = $40;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    MAX_PATH = 260;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;


type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of Char;
    end;

    LUID = record
        LowPart: DWORD;
        HighPart: Longint;
    end;

    LUID_AND_ATTRIBUTES = record
        Luid: LUID;
        Attributes: DWORD;
    end;

    TOKEN_PRIVILEGES = record
        PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
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';
#endif
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';


/////////////////////////////////////////////////////////
function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;

function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
    dwID: DWORD;
begin
    GetWindowThreadProcessId(hwnd, dwID);
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;

function PrivilegeReq(): DWORD;
var
    hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    aBuf: array [0..259] of Char;
    szFileName, szDeviceName: String;
    tkp: TOKEN_PRIVILEGES;
    SeDebugNameValue: LUID;
    i, lpMemory, ret: Longint;
    lpThreadId, dwDrives: DWORD;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
        pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
//            if CompareText(CharArrayToString(pe32.szExeFile), ExtractFileName(szProcess)) <> 0 then Continue;
            // try open process
            hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
            if hProc = TA_FAILED then
            begin
                // open process token adjust privileges
                if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                try
                    // fill token privileges struct
                    tkp.PrivilegeCount := 1;
                    tkp.Privileges[0].Luid := SeDebugNameValue;
                    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    // set debug privileges
                    if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
                    // try open process with debug privileges
                    hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                    if hProc = TA_FAILED then Exit;
                finally
                    tkp.Privileges[0].Attributes := 0;
                    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
                    CloseHandle(hToken);
                end;
            end;
            // if szProcess is full path
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
end;

procedure InitializeWizard();
begin
PrivilegeReq;


R.i.m.s.k.y. 19-07-2013 17:57 2187389

нашел вот что http://support.microsoft.com/kb/981778
поможет ли это под простым пользователем поставить программу, требующую админа, для записи переменных в окружение простого пользователя

Johny777 19-07-2013 20:51 2187530

R.i.m.s.k.y., если честно я нифига не понимаю Зачем тебе весь этот изврат? Программно сделать из простого пользователя админа очень сложно - точно, я почти уверен невозможно. В первую очередь на инно.Но вопрос зачем? Если что-то должно быть сделано админом, то инсталл запрашивает права (по дефолту так). Пусть пользователь введёт пароль админа, или войдет в систему под админом и тд. Не вижу в этом ничего плохого. Я б на твоём месте забил бы. Даже если есть решение, там может быть столько подводных камней, что офигеть можно.

R.i.m.s.k.y. 19-07-2013 21:01 2187542

Цитата:

Цитата Johny777
Но вопрос зачем? »

multiuser enviroment
Цитата:

Цитата Johny777
Если что-то должно быть сделано админом, то инсталл запрашивает права (по дефолту так) »

в том то и да что не запрашивает, при копировании в PF выдает ошибку доступа, при регистрации пишет недостаточно прав
Цитата:

Цитата Johny777
или войдет в систему под админом и тд »

переменная окружения будет админская и все настройки пойдут админу - это и есть подводный камень

Mat_y 19-07-2013 21:17 2187554

Ребят, может кто помочь? У меня тут такая проблемка нарисовалась.... надо добавить в установщик еще 1 окно с выбором компонентов для установки.... точно такое же как и для выбора директории установки, только вместо директории (поля)... поле с выбором компонентов.

Вот тут есть готовый установщик: http://dfiles.ru/files/0v855lkzw

Может кто помочь? Вот тут привожу код для окна с выбором директории... что там надо поменять, чтобы переделать его на окно с компонентами? Я просто еще только начинаю свой путь, еще мало знаний... буду благодарен за любую помощь:
Код:

var
  BkgImg2 : Longint;
  AppLabel, AppLabel2, NeedSizeLabel, NeedSizeLabel2, SDLabel : TLabel;
  BackBtn, DirBrowseBtn, OKBtn : HWND;
  vPanel2 : TPanel;

procedure HideSelectDirPage;
begin
  if CanUseXvid then begin
          vPanel2.Visible:=False;
          mciSendString('stop sdVideo','',0,0);
        end;
  ImgSetVisibility(BkgImg2,False);
  AppLabel.Visible:=False;
  NeedSizeLabel.Visible:=False;
  AppLabel2.Visible:=False;
  NeedSizeLabel2.Visible:=False;
  SDLabel.Visible:=False;
  BtnSetVisibility(BackBtn,False);
  BtnSetVisibility(DirBrowseBtn,False);
  BtnSetVisibility(OKBtn,False);
end;

procedure DirBrowseBtnClick(h:HWND);
begin
  WizardForm.DirBrowseButton.OnClick(WizardForm.DirBrowseButton);
  AppLabel.Caption:=WizardForm.DirEdit.Text;
  AppLabel2.Caption:=WizardForm.DirEdit.Text;
end;

procedure BackBtnClick(h:HWND);
begin
  WizardForm.BackButton.OnClick(WizardForm.BackButton);
end;

procedure OKBtnClick(h:HWND);
begin
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;

procedure ShowSelectDirPage;
begin
  PrevCurPageID:=wpSelectDir;
  ImgSetVisibility(BkgImg2,True);
  AppLabel.Visible:=True;
  NeedSizeLabel.Visible:=True;
  AppLabel2.Visible:=True;
  NeedSizeLabel2.Visible:=True;
  SDLabel.Visible:=True;
  BtnSetVisibility(BackBtn,True);
  BtnSetVisibility(DirBrowseBtn,True);
  BtnSetVisibility(OKBtn,True);
  ImgApplyChanges(WizardForm.Handle);
  if CanUseXvid then begin
          mciSendString('play sdVideo repeat','',0,0);
          vPanel2.Visible:=True;
        end;
end;

procedure CreateSelectDirPage;
begin
  if CanUseXvid then begin
    vPanel2:=TPanel.Create(WizardForm);
    with vPanel2 do begin
      Visible:=False;
      Parent:=WizardForm;
      SetBounds(32,32,704,272);
    end;
          mciSendString('open '+ExpandConstant('{tmp}\vid_instdir.avi')+' alias sdVideo parent '+IntToStr(vPanel2.Handle)+' style child','',0,0);
    mciSendString('put sdVideo window at 0 0 704 272','',0,0);
  end;
 
  BkgImg2:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\pbbkg.png'),28,347,0,0,False,True);

  AppLabel2:=TLabel.Create(WizardForm);
  with AppLabel2 do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:=WizardForm.DirEdit.Text;
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=clBlack;
    end;
    Left:=59;
    Top:=364;
  end;
  AppLabel:=TLabel.Create(WizardForm);
  with AppLabel do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:=WizardForm.DirEdit.Text;
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=$e5e5e5;
    end;
    Left:=57;
    Top:=362;
  end;

  NeedSizeLabel2:=TLabel.Create(WizardForm);
  with NeedSizeLabel2 do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:='Для установки игры требуется 12.00 ГБ';
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=clBlack;
    end;
    Left:=41;
    Top:=411;
  end;
  NeedSizeLabel:=TLabel.Create(WizardForm);
  with NeedSizeLabel do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:='Для установки игры требуется 12.00 ГБ';
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=$e5e5e5;
    end;
    Left:=39;
    Top:=409;
  end;

  SDLabel:=TLabel.Create(WizardForm);
  with SDLabel do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:='ПАПКА УСТАНОВКИ ИГРЫ:';
    with Font do begin
      Name:=FontName;
      Size:=13;
      Color:=$e5e5e5;
    end;
    Left:=50;
    Top:=315;
  end;

  BackBtn:=BtnCreate(WizardForm.Handle,30,450,135,30,PAnsiChar(ExpandConstant('{tmp}\button4.png')),2,False);
  BtnSetEvent(BackBtn, BtnClickEventID,WrapBtnCallback(@BackBtnClick,1));
  BtnSetFont(BackBtn,BtnFont2.Handle);
  BtnSetText(BackBtn,'НАЗАД');
  BtnSetFontColor(BackBtn,$e5e5e5,$ffffff,$ffffff,$8a390e);
  BtnSetEvent(BackBtn,BtnMouseEnterEventID,WrapBtnCallback(@BtnMouseEnter,1));

  DirBrowseBtn:=BtnCreate(WizardForm.Handle,603,405,135,30,PAnsiChar(ExpandConstant('{tmp}\button4.png')),2,False);
  BtnSetEvent(DirBrowseBtn, BtnClickEventID,WrapBtnCallback(@DirBrowseBtnClick,1));
  BtnSetFont(DirBrowseBtn,BtnFont2.Handle);
  BtnSetText(DirBrowseBtn,'ИЗМЕНИТЬ');
  BtnSetFontColor(DirBrowseBtn,$e5e5e5,$ffffff,$ffffff,$8a390e);
  BtnSetEvent(DirBrowseBtn,BtnMouseEnterEventID,WrapBtnCallback(@BtnMouseEnter,1));

  OKBtn:=BtnCreate(WizardForm.Handle,606,450,135,30,PAnsiChar(ExpandConstant('{tmp}\button4.png')),2,False);
  BtnSetEvent(OKBtn, BtnClickEventID,WrapBtnCallback(@OKBtnClick,1));
  BtnSetFont(OKBtn,BtnFont2.Handle);
  BtnSetText(OKBtn,'OK');
  BtnSetFontColor(OKBtn,$e5e5e5,$ffffff,$ffffff,$8a390e);
  BtnSetEvent(OKBtn,BtnMouseEnterEventID,WrapBtnCallback(@BtnMouseEnter,1));
end;


Johny777 20-07-2013 12:42 2187752

R.i.m.s.k.y.,
Цитата:

Цитата R.i.m.s.k.y.
я наверное что-то не так делаю, »

Вот чисто настройка привилегии:

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

#define A = (Defined UNICODE) ? "W" : "A"

const
   
TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    ////////////////////////////////////////////////
   
SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
    SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
    SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
    SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
    SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
    SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
    SE_TCB_NAME = 'SeTcbPrivilege';
    SE_SECURITY_NAME = 'SeSecurityPrivilege';
    SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
    SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
    SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
    SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
    SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
    SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
    SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
    SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
    SE_BACKUP_NAME = 'SeBackupPrivilege';
    SE_RESTORE_NAME = 'SeRestorePrivilege';
    SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    SE_DEBUG_NAME = 'SeDebugPrivilege';
    SE_AUDIT_NAME = 'SeAuditPrivilege';
    SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
    SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
    SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
    SE_UNDOCK_NAME = 'SeUndockPrivilege';
    SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
    SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
    SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';
    SE_IMPERSONATE_NAME = 'SeImpersonatePrivilege';
    SE_CREATE_GLOBAL_NAME = 'SeCreateGlobalPrivilege';


type
   
LUID = record
       
LowPart: DWORD;
        HighPart: Longint;
    end;

    LUID_AND_ATTRIBUTES = record
       
Luid: LUID;
        Attributes: DWORD;
    end;

    TOKEN_PRIVILEGES = record
       
PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';


function AdjustSelfProcessPrivileges(const PrivilegeName: String; const Enable: Boolean): Boolean;
var
   
tkp: TOKEN_PRIVILEGES;
    hToken: THandle;
    ret: Longint;
begin
   
// open process token adjust privileges
   
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    try
       
// Get the locally unique identifier (LUID) .
       
if LookupPrivilegeValue('', PChar(PrivilegeName), tkp.Privileges[0].Luid) then
        begin
           
// fill token privileges struct
           
tkp.PrivilegeCount := 1; // one privilege to set
           
if Enable then
           
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else
           
tkp.Privileges[0].Attributes := 0;
            // enable or disable the privilege
           
Result := AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
            //if not Result then  ShowMessage(SysErrorMessage(GetLastError));
       
end;
    finally
       
CloseHandle(hToken);
    end;
end;





/////////////////////////////
procedure InitializeWizard();
begin
    if
AdjustSelfProcessPrivileges(SE_DEBUG_NAME, True) then
    try
       
MsgBox('Privilege Ajusted', mbInformation, MB_OK);
        MsgBox('Do something', mbInformation, MB_OK);
    finally
        if
AdjustSelfProcessPrivileges(SE_DEBUG_NAME, False) then MsgBox('Privilege Not Ajusted', mbInformation, MB_OK);
    end
   
    else
MsgBox('Error', mbInformation, MB_OK);
end;



Какая из них тебе нужна не заню
Предполагаю - для каждого действия с твоей стороны нужна своя привилегия, а не одна на все!
Если используешь несколько подряд. Не забывай удалять старую (при помощи булев аргумента Enable) перед настройкой новой

UPD:
Кажись это всё-таки то, что тебе нужно. Вот статья http://www.rsdn.ru/article/baseserv/privileges.xml
там написано: " Учетные записи пользователей и групп являются доверенными объектами системы. Доверенные объекты – это сущности, которым может быть предоставлен или отклонен доступ к защищаемым объектам или ресурсам системы. Привилегии – это права доверенного объекта на совершение каких-либо действий по отношению ко всей системе."

R.i.m.s.k.y. 20-07-2013 14:04 2187774

Johny777, крокодил не растет, регистрация валится с ошибкой 0х05
Код:

    if AdjustSelfProcessPrivileges(SE_BACKUP_NAME, True) then  //SE_TCB_NAME
    try
        MsgBox('Privilege Ajusted', mbInformation, MB_OK);
        MsgBox('Do something', mbInformation, MB_OK);
        RegisterServer(true, 'c:\Program Files (x86)\LAV\LAVVideo.ax', False);
    finally
    //    if AdjustSelfProcessPrivileges(SE_DEBUG_NAME, False) then MsgBox('Privilege Not Ajusted', mbInformation, MB_OK);
    end
        else MsgBox('Error', mbInformation, MB_OK);


Johny777 20-07-2013 14:35 2187784

Цитата:

Цитата R.i.m.s.k.y.
регистрация валится с ошибкой 0х05 »

Текст ошибки можно получить так: MsgBox(SysErrorMessage($05), mbError, MB_OK); // 0x05 = $05

// MsgBox( SysErrorMessage(DLLGetLastError), mbError, MB_OK ); можно вызывать после каждой функции если она не отработала

""Отказано в доступе"". Значит у тебя нет привилегии/права делать это. Пробуй другие привилегии, пока не получится. Метод проб и ошибок - тоже метод :) И какое отношени имеет "Резервное копирование" к регистрации?

R.i.m.s.k.y. 20-07-2013 17:14 2187852

Johny777, я знаю что 0х05 "ты не лев, недостаточно прав"
SE_TCB_NAME - тоже самое

такой еще вопрос знатокам - RunAsOriginalUser должен чье имя возвращать? originalUser или админа введшего пароль?
Код:

[Setup]
PrivilegesRequired=admin

procedure InitializeWizard();
var ResultCode : integer;
begin
  ExecAsOriginalUser('cmd.exe', '/c echo > c:\1\1.txt %username%', ExpandConstant('{sys}'), SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

инсталл запускается двойным кликом (не ПКМ - запуск от...), UAC спрашивает логин/пасс админа, и в c:\1\1.txt появляется имя одмина, хотя КМК там должно быть имя User'а тк он вошел в систему

Mat_y 20-07-2013 22:24 2187969

Ребят, какой код надо написать, чтобы Inno понял, что на этой форме должен быть выбор компонентов?

R.i.m.s.k.y. 20-07-2013 22:37 2187971

Mat_y, а стандартый [Components] чем не устраивает?

saurn 20-07-2013 22:52 2187978

Цитата:

Цитата R.i.m.s.k.y.
UAC спрашивает логин/пасс админа, и в c:\1\1.txt появляется имя одмина, хотя КМК там должно быть имя User'а тк он вошел в систему »

А разве в этом случае установка идет уже не под админом?
Цитата:

Цитата R.i.m.s.k.y.
[Setup] PrivilegesRequired=admin »

Указывает, что инсталу для работы нужны повышеные полномочия. Но лишь указывает. При запуске винда видит, что инсталу нужно повышение полномочий, что она и делает, автоматически запуская от имена админа. Так что в данном случае дальнейшее RunAsOriginalUser будет уже админ. Или не? В этих учетных записях тёмный лес.
Цитата:

Цитата Mat_y
Ребят, какой код надо написать, чтобы Inno понял, что на этой форме должен быть выбор компонентов? »

Для сего действа есть секция [Components]
Код:

[Components]
Name: a; Description: Компонент 1; Types: full;
Name: b; Description: Компонент 2; Types: custom;


Mat_y 20-07-2013 23:44 2187999

Цитата:

Mat_y, а стандартый [Components] чем не устраивает?
Не ребят, Вы меня не поняли... это все логично и понятно... но вот есть окна в установщике... приветствие, выбор директории установки, далее обычно идет выбор компонентов установки, и потом уже окно с ходом установки. Я использовал готовый скрипт и модифицировал его, но там нету окна с выбором компонентов... мне удалось добавить недостающее окно между выбором директории и установкой, но вот как сказать в CODE установщику, что это именно нужное для компонентов окно и как разместить там само поле с выбором программ, я не догоняю.

Вот окно приветствия:

Вот выбор директории:

И установка:


Я продублировал окно с выбором директории... изменил все переменные, убрал лишнее... а вот как туда вставить поле с выбором компонентов... сижу, второй день туплю.


ВОТ пример создания старницы выбора директории:

1) Создаются кнопки, выбор директории, назад, далее:
Код:

procedure DirBrowseBtnClick(h:HWND);
begin
  WizardForm.DirBrowseButton.OnClick(WizardForm.DirBrowseButton);
  AppLabel.Caption:=WizardForm.DirEdit.Text;
  AppLabel2.Caption:=WizardForm.DirEdit.Text;
end;

procedure BackBtnClick(h:HWND);
begin
  WizardForm.BackButton.OnClick(WizardForm.BackButton);
  end;

procedure OKBtnClick(h:HWND);
begin
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
begin HideWelcomePage; HideSelectDirPage;  ShowSelectComponentsPage;
    end;
  end;

2) Добавляется видео: (CreateSelectDirPage будет относится ко всему ниже... просто разобью на куски код)
Код:

procedure CreateSelectDirPage;
begin
  if CanUseXvid then begin
    vPanel2:=TPanel.Create(WizardForm);
    with vPanel2 do begin
      Visible:=False;
      Parent:=WizardForm;
      SetBounds(32,32,704,272);
    end;
          mciSendString('open '+ExpandConstant('{tmp}\vid_instdir.avi')+' alias sdVideo parent '+IntToStr(vPanel2.Handle)+' style child','',0,0);
    mciSendString('put sdVideo window at 0 0 704 272','',0,0);
  end;

3) Добавляем фоновую картинку, которая будет рамкой окна и в него вписываем путь установки:
Код:

BkgImg2:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\pbbkg.png'),28,347,0,0,False,True);

  AppLabel2:=TLabel.Create(WizardForm);
  with AppLabel2 do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:=WizardForm.DirEdit.Text;
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=clBlack;
    end;
    Left:=59;
    Top:=364;
  end;
  AppLabel:=TLabel.Create(WizardForm);
  with AppLabel do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:=WizardForm.DirEdit.Text;
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=$e5e5e5;
    end;
    Left:=57;
    Top:=362;
  end;

Ну и так далее...
А вот как сделать подобное для окна выбора компонентов?

R.i.m.s.k.y. 21-07-2013 00:01 2188006

Цитата:

Цитата saurn
А разве в этом случае установка идет уже не под админом? »

в том то и да что RunAsOriginalUser должна возвращать (и запускать) под пользователем, вошедшим в систему
Цитата:

Цитата saurn
Указывает, что инсталу для работы нужны повышеные полномочия. Но лишь указывает. При запуске винда видит, что инсталу нужно повышение полномочий, что она и делает, автоматически запуская от имена админа. Так что в данном случае дальнейшее RunAsOriginalUser будет уже админ. Или не? В этих учетных записях тёмный лес. »

нет, при включенном UAC установщик скажет винде "мне нужны одминские права", UAC выдаст окно на логин/пасс одмина, и установщик продолжит от одмина, но фишка OriginalUser как раз в том чтобы поставить пользователю, в сессии которого запустили установщик, а не от которого запустили его

Johny777 21-07-2013 18:45 2188253

Mat_y, В данном скрипте окна "создаются" процедурами. Дело в том, что стандартный TNoteBook - древний предок TPageControl здесь скрыт, и есть только сама форма TWizardForm и в педелах клиентской области в зависимости от индекса текущей страницы становятся видимыми/невидимыми соответствующие элементы интефейса. Всё это наглядно видно в procedure CurPageChanged(CurPageID: Integer);
основного скрипта. Для того чтобы добавить ещё одну страницу между стр. выбора директории и стр. установки необходимо удалить директиву DisableReadyPage=yes из раздела [Setup]. Список страниц такой:
читать дальше »
Код:

const
  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;


Те страница номер 10 то что нужну
Далее в procedure CurPageChanged(CurPageID: Integer);
добавим следующее (красным выделил имплиментацию новой страницы)
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpWelcome: begin
      if PrevCurPageID=wpSelectDir then HideSelectDirPage;
      ShowWelcomePage;
    end;
    wpSelectDir: begin
      if PrevCurPageID=wpWelcome then HideWelcomePage;
      ShowSelectDirPage;
    end;
 
    wpReady: begin
      if PrevCurPageID=wpSelectDir then HideSelectDirPage;
      ShowSelectComonentsPage;
    end;

   
    wpInstalling: begin
      if PrevCurPageID=wpReady then HideSelectComonentsPage;
      ShowInstallingPage;
    end;
  end;
end;


Надеюсь ты понимаешь весь принцип. Те для каждой страницы Действуют 3 процедуры:
CreateИмяСтраницы (где-то во внешних библиотеках при инициализации)
ShowИмяСтраницы
HideИмяСтраницы
Остаётся только описание тела процедур для твоей новой страницы, и оно такое же как и у других страниц, только с твоим содержимым на ней (видео, чекбоксы и пр.)

adelina.dragonborn@vk 21-07-2013 23:35 2188354

Всем привет. Хочу добавить ярлык в обозреватель игр в Windows 7. Это уже, конечно, обсуждалось, однако, как бы я ни старался, не могу создать ярлык.

Делал по инструкции

Код:

#define GDFBinary "{app}\GDF.dll" 
 
[Tasks]
Name: Gameux; Description: "Добавить ссылки в Game Explorer"; GroupDescription: "Game Explorer:"; MinVersion: ,6.0.6000; 
 
[Files]
Source: include\GDF.dll; DestDir: {app};
Source: include\GameuxInstallHelper.dll; DestDir: {app}; Flags: overwritereadonly
 
[_Code]
type
TGUID = record D1: Cardinal; D2: Word; D3: Word; D4: Array [0..8] of Byte; end;
 
function AddToGameExplorer(BinaryPatch: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal; external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly'; 
function RetrieveGUIDForApplication(BinaryPatch: String; var GUID: TGUID): Cardinal; external 'RetrieveGUIDForApplicationA@{app}\GameuxInstallHelper.dll stdcall uninstallonly'; 
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal; external 'RemoveFromGameExplorer@{app}\GameuxInstallHelper.dll stdcall uninstallonly'; 
 
var GUID: TGUID; 
procedure CurStepChanged(CurStep: TSetupStep); 
var GDFBinary: String; 
  begin 
    if (CurStep = ssPostInstall) and IsTaskSelected('Gameux') then
      begin 
        GDFBinary:=ExpandConstant('{#GDFBinary}'); 
        AddToGameExplorer(GDFBinary, ExpandConstant('{app}'), 3, GUID); 
      end; 
  end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
var GDFBinary: String; GUID: TGUID; 
  begin 
    if (CurUninstallStep=usUninstall) then 
      begin 
        GDFBinary:=ExpandConstant('{#GDFBinary}'); 
        RetrieveGUIDForApplication(GDFBinary, GUID); 
        RemoveFromGameExplorer(GUID); 
        UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll')); 
      end; 
  end;

Естественно, подправив. Однако, на этапе компилляции выскакивает ошибка Duplicate identifier 'TGUID'

Порывшись, узнал, что это из-за версии компиллятора. Чтобы не менять версию, закомменторовал строчку type TGUID = record D1: Cardinal; D2: Word; D3: Word; D4: Array [0..8] of Byte; end;

Может ли это являться причиной моих неудач?

Конечно, есть также вероятность, что я неправильно сконструировал GDF.dll

Инструкции нормальной таки не нашел. Если такая имеется, то подскажите, где ее брать...

adelina.dragonborn@vk 22-07-2013 00:38 2188374

saurn, да, юникодавая. Но она поддерживает некоторые функции, т.ч. я не хотел бы отказываться от нее...

P.S. последняя поправка проблему не решает. Ошибка на строке TGUID = record
- Duplicate identifier 'TGUID'

adelina.dragonborn@vk 22-07-2013 00:54 2188380

saurn, ох, ковыряю уже давно...Явно что-то там не так)

adelina.dragonborn@vk 22-07-2013 01:17 2188388

saurn, спасибо, проверю!

saurn, не создается, зараза...

saurn 22-07-2013 02:10 2188402

adelina.dragonborn@vk, а так:
читать дальше »
Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
#define GDFBinary "{app}\GDF.dll"

type
   
TGUID_ID = record
     
DATA1: Cardinal;
      DATA2: Word;
      DATA3: Word;
      DATA4: Array [0..8] of Byte;
    end;


function AddToGameExplorer(BinaryPatch: String; Path: String; InstallType: Integer; var GUID: TGUID_ID): Cardinal; external 'AddToGameExplorer{#A}@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(BinaryPatch: String; var GUID: TGUID_ID): Cardinal; external 'RetrieveGUIDForApplication{#A}@{app}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID_ID): Cardinal; external 'RemoveFromGameExplorer@{app}\GameuxInstallHelper.dll stdcall uninstallonly';


var
   
GUID: TGUID_ID;

   
procedure CurStepChanged(CurStep: TSetupStep);
var
   
GDFBinary: String;
begin
    case
CurStep of
       
ssPostInstall:
        begin
            if
isTaskSelected('Gameux') then
           
GDFBinary:=ExpandConstant('{#GDFBinary}');
            AddToGameExplorer(GDFBinary, ExpandConstant('{app}'), 3, GUID);
        end;
    end;
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
   
GDFBinary: String;
    GUID: TGUID_ID;
begin
    case
CurUninstallStep of
       
usUninstall:
        begin
           
GDFBinary:=ExpandConstant('{#GDFBinary}');
            RetrieveGUIDForApplication(GDFBinary, GUID);
            RemoveFromGameExplorer(GUID);
            UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll'));
        end;
    end;
end;


mat_y@vk 22-07-2013 08:54 2188461

Цитата:

Цитата Johny777
добавим следующее (красным выделил имплиментацию новой страницы) »

Спасибо огромное, хотя это я и так понял... этот принцип... но загвоздка в том, что у нас появляется 2 "if PrevCurPageID=wpSelectDir" - первое IF и третье... и получается билиберда... я решил это следующим способом... я пришил эту функцию к Кнопке "Далее":
Код:

procedure OKBtnClick(h:HWND);
begin
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
begin HideWelcomePage; HideSelectDirPage;  ShowSelectComponentsPage;
    end;
  end;

Цитата:

Цитата Johny777
необходимо удалить директиву DisableReadyPage=yes из раздела [Setup] »

А причем тут ReadyPage? Мне же нужен wpSelectComponents = 7;
Объясните пожалуйста.

Это все (вышеописанное) я уже сделал... а как добавить то само поле с выбором компонентов... ему же надо задать координаты на форме и его размер... как его описать в скрипте?

nik1967 22-07-2013 10:13 2188482

mat_y@vk,
Как вариант
Код:

[Setup]
AppName=Приложение
AppVerName=Приложение
DefaultDirName={pf}\123
OutputDir=.

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

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: Game; Description: Game_Component;
Name: Game\Lokal; Description: Game_Local_Component; Flags: exclusive; Types: full;
Name: Game\Full; Description: Game_Full_Component; Flags: exclusive;

[_Code]
var
  NewForm: TWizardPage;

procedure InitializeWizard();                     
begin
  NewForm:= CreateCustomPage(wpSelectComponents, 'Выбор компонентов', 'Что нибудь ещё');
  with WizardForm.ComponentsList do begin
    Parent:= NewForm.Surface;
  end;
end;


А, не. Ты же делаешь на ботве. Советую скачать Need for Speed™ Undercover.iss v 2.4c [Final] от YURSHAT модернизированный мной, и посмотреть, как там реализованы компоненты.

Лишние символы
Код:

procedure OKBtnClick(h:HWND);
begin
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
begin HideWelcomePage; HideSelectDirPage;  ShowSelectComponentsPage;
    end;
  end;


adelina.dragonborn@vk 22-07-2013 11:12 2188515

saurn, гениально! It Works! Сам бы никогда не додумался)

Теперь другая проблема...Resource Hacker не слушается. Может есть другой аналог-заменитель? Restorator боюсь ставить - один раз он уже сыграл со мной злую шутку.

saurn 22-07-2013 12:06 2188552

adelina.dragonborn@vk, оффтоп, ну да ладно...
читать дальше »
О рестораторе плохого не скажу, пользуюсь только им уже невесть сколько лет. Есть еще PE Explorer. Из бесплатных, пожалуй, только Resource Hacker, - а в чем проблема, он тоже справится с этой задачей.

adelina.dragonborn@vk 22-07-2013 12:20 2188562

saurn, проблемы:
1) отсутствует оценка игры (хотя в xml-е присутствуют оценки - <Rating ratingSystemID="{768BD93D-63BE-46A9-8994-0B53C4B5248F}" ratingID="{78D8CC82-372F-44e4-B70C-8944DB7BCC24}">
2) Издатель и разработчик присутствуют, однако должна быть ссылка на них - ее нету (хотя ссылка прописана в xml-е - <Publisher URI="http://www.activision.com">Activision, Inc.</Publisher>
3) В GDF-Maker'e есть опция - Thumbnail (логотип игры). Как его запихать в dll? Action -> Add new resource -> выбираю изображение -> а дальше куда его? (Type, name в частности) - Решено.
4) Задана папка сейвов (Saved Game Folder), где она должна отображаться в проводнике игр?

P.S. Если есть xml - был бы благодарен, если поделитесь :)

saurn 22-07-2013 12:29 2188569

adelina.dragonborn@vk, все описаное выше, это вина GDF-Maker'а. Он кривой, или не полный, не знаю, корректно работают только dll'ки идущие вместе с игрой. XML можете выдрать из той библы, что я давал для проверки.

adelina.dragonborn@vk 22-07-2013 12:59 2188580

saurn, спасибо за информацию.

А из той библы вырываются только Data_2.bin и Data_1.bin

Нет XML...

adelina.dragonborn@vk 22-07-2013 19:33 2188771

уже не знаю, что делать...пол дня убил, ниче не выходит, все также не показывается оценка, все также не работает ссылка, ерунда какая-то. Вырвал из той библы Data_2.bin и Data_1.bin (которые и являются xml-файлами), отредактировал, запихал в ту же библу, и один фиг ниче не изменилось, все тоже самое...

mat_y@vk 23-07-2013 14:42 2189188

Цитата:

Цитата nik1967
Советую скачать Need for Speed™ Undercover.iss v 2.4c [Final] от YURSHAT модернизированный мной, и посмотреть, как там реализованы компоненты. »

А не возьметесь добавить эту форму за материальную благодарность? А то я уже прям совсем отчаялся.

vint56 23-07-2013 21:45 2189432

mat_y@vk вот
http://rghost.ru/47620796

mat_y@vk 24-07-2013 08:33 2189578

Цитата:

Цитата vint56

Огромнейшее спасибо. Я правильно понял, что для каждого компонента надо создавать (описывать) свою строчку кодом? А если у меня 10-15 компонентов, можно как-то создать скроллинг или создать поле, в которое будут автоматом браться компоненты из раздела Components? У Вас есть скайп?

vint56 24-07-2013 14:53 2189756

mat_y@vk
http://rghost.ru/47633999

Mat_y 24-07-2013 20:46 2190008

vint56, а с чем Вы работаете? У меня Inno ругается на ComponentsListTVStyle=yes и так далее по тексту?

vint56 24-07-2013 20:49 2190012

Mat_y InnoUltra там есть вот здесь можеш скачать http://innoultra.ru/
Inno Setup restool 5.5.1 ee2 unicode

Mat_y 24-07-2013 21:25 2190034

vint56, а Вы знаете, можно ли для ярлыка прописать "/"... мне надо к имени добавить " /launcher"... а Инно переворачивает"\" и превращает в путь.

adelina.dragonborn@vk 24-07-2013 22:21 2190085

Хочу сделать кнопку на странице установки - "пауза" (остановить стандартную распаковку)
Есть похожий скрипт где-нибудь?

Mat_y, Parameters: "/launcher"

vint56 24-07-2013 22:35 2190094

Mat_y
[Icons]
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon; Parameters: /launcher;

mat_y@vk 25-07-2013 14:45 2190468

vint56, и опят примного благодарен.
А есть ли способ заставить установщик найти папку на компьютере и скопировать ее в другое место?

vint56 25-07-2013 17:30 2190579

mat_y@vk
читать дальше »
[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg
OutputDir=.

[code]
type
Pchar = PAnsiChar;

function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure Backup (const Mydir,BackDir: string; MyFiles: array of string);
var
i:integer;
FindFiles: TFindRec;
begin
for i:=0 to GetArrayLength(MyFiles)-1 do
begin
if FindFirst(MyDir+MyFiles[i], FindFiles) then begin
if not DirExists(BackDir) then CreateDir(BackDir);
repeat MoveFile(MyDir+FindFiles.Name, BackDir+FindFiles.Name) until not FindNext(FindFiles);
FindClose(FindFiles);
RemoveDir(MyDir)
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
// Backup(ExpandConstant('{app}\Game\Bin\'), ExpandConstant('{app}\Backup\'),['TS3.exe','gameplay.package','*.precomp','*.bmp','*.pk3']);
Backup(ExpandConstant('{app}\Game\Bin\'), ExpandConstant('{app}\Backup\'),['*.pk3']);
// Backup(папка откуда брать файлы, папка куда перемещать файлы, файлы или маски файлов)
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then begin
Backup(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}\Game\Bin\'),['*']);
end;
end;

Johny777 25-07-2013 18:06 2190613

vint56, mat_y@vk, Копирование папки методом "CopyFolder" FileSystemObject-а:
(http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx)

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

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
type
   
LPCTSTR = String;

function PathIsDirectory(pszPath: LPCTSTR): BOOL; external 'PathIsDirectory{#A}@Shlwapi.dll stdcall';
function PathFileExists(pszPath: LPCTSTR): BOOL; external 'PathFileExists{#A}@Shlwapi.dll stdcall';
function SetFileAttributes(lpFileName: LPCTSTR; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@Kernel32.dll stdcall';
function GetFileAttributes(lpFileName: LPCTSTR): DWORD; external 'GetFileAttributes{#A}@Kernel32.dll stdcall';


function CopyFolder(const Source, Destination: String; const Overwrite: Boolean): Boolean;
var
   
ModifiedDestPath: String;
    oFS: Variant;
    adjAttr: BOOL;
begin
    if not
PathFileExists(Source) then Exit;
    if not PathFileExists(Destination) then
    begin
        if not
ForceDirectories(Destination) then Exit;
    end else if not PathIsDirectory(Destination) then Exit;
    ModifiedDestPath := AddBackslash(RemoveBackslash(Destination))
    if (GetFileAttributes(ModifiedDestPath) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
    begin
       
adjAttr := SetFileAttributes(ModifiedDestPath, FILE_ATTRIBUTE_NORMAL);
        if not adjAttr then Exit;
    end;

    ////////////////////////////////////////////////////
   
oFS := CreateOleObject('Scripting.FileSystemObject');
    try
       
Result := oFS.CopyFolder(Source, ModifiedDestPath, Overwrite);
    except
       
ShowExceptionMessage();
    finally
        if
adjAttr then SetFileAttributes(ModifiedDestPath, FILE_ATTRIBUTE_READONLY);
    end;
end;



procedure InitializeWizard();
begin
   
CopyFolder('C:\test\VALVE\half-life 2\bin', 'C:\Copy', True);
end;



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

    if not PathFileExists(Source) then Exit;
    if not PathFileExists(Destination) then
    begin
        if not
ForceDirectories(Destination) then Exit;
    end else if not PathIsDirectory(Destination) then Exit;
    ModifiedDestPath := AddBackslash(RemoveBackslash(Destination))
    if (GetFileAttributes(ModifiedDestPath) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
    begin
       
adjAttr := SetFileAttributes(ModifiedDestPath, FILE_ATTRIBUTE_NORMAL);
        if not adjAttr then Exit;
    end;


нужен чтоб не было исключений при копировании. Возможные причины появления исключений по ссылке выше, внизу

PS: Рекомендую копировать с перезаписью, чтоб не было исключения в случае если копируемая папка существует

Mat_y 25-07-2013 22:09 2190750

vint56, Johny777, а если мне надо, чтобы папка копировалась, когда я выбрал соответствующий элемент при выборе компонентов?
Мне надо, чтобы файлы полностью скопировались из одной папки в другую, а потом часть из них заменилась на файлы из инсталлятора (записалась поверх).

adelina.dragonborn@vk 26-07-2013 10:33 2190964

Mat_y, используй IsComponentSelected

mat_y@vk 26-07-2013 15:59 2191146

vint56, А ваш код будет работать без

function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

И еще... вроде я код вставил... фаил собрался... новая папка не появилась, зато папка по указанному адресу исчезла :(

Цитата:

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

Johny777, а как в Ваш код добавить IsComponentSelected?
CopyFolder('C:\test\VALVE\half-life 2\bin', 'C:\Copy', True); можно заменить на CopyFolder('{app}\1\', '{app}\2\, True); ???

saurn 26-07-2013 17:09 2191183

Цитата:

Цитата mat_y@vk
Johny777, а как в Ваш код добавить IsComponentSelected? »

Копирование папки на шаге PostInstall, если выбран соответствующий компонент. Только в качестве примера.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputBaseFilename=1
OutputDir=...

[Files]
Source: c:\windows\fonts\*; DestDir: {app}\1; Flags: external

[Components]
Name: copyfolder; Description: Копировать папку;

[Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
type
   
LPCTSTR = String;

function PathIsDirectory(pszPath: LPCTSTR): BOOL; external 'PathIsDirectory{#A}@Shlwapi.dll stdcall';
function PathFileExists(pszPath: LPCTSTR): BOOL; external 'PathFileExists{#A}@Shlwapi.dll stdcall';
function SetFileAttributes(lpFileName: LPCTSTR; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@Kernel32.dll stdcall';
function GetFileAttributes(lpFileName: LPCTSTR): DWORD; external 'GetFileAttributes{#A}@Kernel32.dll stdcall';


function CopyFolder(const Source, Destination: String; const Overwrite: Boolean): Boolean;
var
   
ModifiedDestPath: String;
    oFS: Variant;
    adjAttr: BOOL;
begin
    if not
PathFileExists(Source) then Exit;
    if not PathFileExists(Destination) then
    begin
        if not
ForceDirectories(Destination) then Exit;
    end else if not PathIsDirectory(Destination) then Exit;
    ModifiedDestPath := AddBackslash(RemoveBackslash(Destination))
    if (GetFileAttributes(ModifiedDestPath) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
    begin
       
adjAttr := SetFileAttributes(ModifiedDestPath, FILE_ATTRIBUTE_NORMAL);
        if not adjAttr then Exit;
    end;

    ////////////////////////////////////////////////////
   
oFS := CreateOleObject('Scripting.FileSystemObject');
    try
       
Result := oFS.CopyFolder(Source, ModifiedDestPath, Overwrite);
    except
       
ShowExceptionMessage();
    finally
        if
adjAttr then SetFileAttributes(ModifiedDestPath, FILE_ATTRIBUTE_READONLY);
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
CurStep of
     
ssPostInstall: if IsComponentSelected('copyfolder') then CopyFolder(ExpandConstant('{app}\1'), ExpandConstant('{app}\2'), True);
  end;
end;


Fakt_37 26-07-2013 19:48 2191237

Ребят может вы поможете, возникла такая проблема через SrepInside жму файлы, в батнике пишу arc.exe a -ep1 -dses --dirs -s; -lc- -di -i2 -r -msrep:l256+lzma:a1:mfbt4:d200m:fb128:mc1000:lc8 data.arc packeddata\* (как обычно я делал) но теперь выдаёт ошибку ISDone.dll Понимаю что не в тему, но может кто знает подскажите

Mat_y 26-07-2013 20:39 2191252

saurn, а если у меня разных компонента требуют копирования одной и той же папки, то мне надо будет сделать так:?

begin
case CurStep of
ssPostInstall: if IsComponentSelected('copyfolder1','copyfolder2') then CopyFolder(ExpandConstant('{app}\1'), ExpandConstant('{app}\2'), True);
end;

А Если у меня 2 разных компонента требуют копирования 2-х разных папок независимо? То так:

begin
case CurStep of
ssPostInstall: if IsComponentSelected('copyfolder1') then CopyFolder(ExpandConstant('{app}\1'), ExpandConstant('{app}\2'), True);
if IsComponentSelected('copyfolder2') then CopyFolder(ExpandConstant('{app}\2'), ExpandConstant('{app}\3'), True);
end;

saurn 26-07-2013 20:57 2191262

Цитата:

Цитата Mat_y
если у меня разных компонента требуют копирования одной и той же папки »

Код:

if IsComponentSelected('copyfolder') or IsComponentSelected('copyfolder2') then CopyFolder(ExpandConstant('{app}\1'), ExpandConstant('{app}\2'), True);
Цитата:

Цитата Mat_y
А Если у меня 2 разных компонента требуют копирования 2-х разных папок независимо? »

Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
      ssPostInstall:
      begin
          if IsComponentSelected('copyfolder') then CopyFolder(ExpandConstant('{app}\1'), ExpandConstant('{app}\2'), True);
          if IsComponentSelected('copyfolder2') then CopyFolder(ExpandConstant('{app}\2'), ExpandConstant('{app}\3'), True);
      end;
  end;
end;


Mat_y 26-07-2013 21:19 2191281

saurn, если у меня уже есть

Код:

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

Я могу просто ниже вставить?? во так:
Код:

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  //Если необходимо, можно поменять на ssPostInstal

if IsComponentSelected('copyfolder') or IsComponentSelected('copyfolder2') then CopyFolder(ExpandConstant('{app}\1'), ExpandConstant('{app}\2'), True);

Почему компилятор может ругаться на эту строчку уже во время установки, а не сборки:???
Код:

    try
        Result := oFS.CopyFolder(Source, ModifiedDestPath, Overwrite);
    except

Может проще сюда мой конфиг выложить? Хотя мне нравится учиться... главное учителей не замучить :)

Fakt_37 26-07-2013 21:50 2191308

а кто что пишет в батнике для SrepInside&

Mat_y 27-07-2013 13:25 2191526

Ребята, выходные?

audiofeel 27-07-2013 21:38 2191808

Привет всем, прогресс бар идет поверх "процентов" (Pct). как его сделать поверх прогресс бара

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

#define MyAppName "Battlefield 3"
#define NeedSize 23140
;#define records

[Setup]
AppName={#MyAppName}
DefaultDirName={pf}\Origin Games\{#MyAppName}
OutputBaseFilename=Touchup
Compression=lzma/ultra64
SolidCompression=true
DisableReadyPage=true
SetupIconFile=Files\app.ico
Uninstallable=false
CreateUninstallRegKey=false
UpdateUninstallLogAppName=false
VersionInfoVersion=1.6.0.0
AppVerName={#MyAppName}
UsePreviousGroup=false
AppendDefaultGroupName=false
DisableProgramGroupPage=true
VersionInfoCompany=Electronic Arts, Inc.
VersionInfoDescription=EA Installer Touchup
VersionInfoCopyright=(C) 2013 MaratRepack
InternalCompressLevel=ultra64

[Files]
Source: dll\b2p.dll; Flags: dontcopy
Source: dll\botva2.dll; Flags: dontcopy
Source: dll\gdiplus.dll; Flags: dontcopy
Source: Files\Button.png; Flags: dontcopy
Source: Files\dir.png; Flags: dontcopy
Source: Files\edit.png; Flags: dontcopy
Source: Files\exit.png; Flags: dontcopy
Source: Files\min.png; Flags: dontcopy
Source: Files\pb.png; Flags: dontcopy
Source: Files\pb1.png; Flags: dontcopy
Source: Files\2work1.jpg; Flags: dontcopy
Source: Files\2work2.jpg; Flags: dontcopy
Source: Files\2work5.jpg; Flags: dontcopy
Source: Files\2work6.jpg; Flags: dontcopy
Source: Files\2workerror.jpg; Flags: dontcopy

Source: ISDone\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\ISDone.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\facompress.dll; DestDir: {tmp}; Flags: dontcopy

#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif

[Messages]
ButtonNext=Äàëåå
ButtonCancel=Îòìåíà
ButtonBack=Íàçàä
ButtonWizardBrowse=Èçìåíèòü
SetupAppTitle=EA Installer Touchup
ExitSetupMessage=Âûéòè èç ïðîãðàììû óñòàíîâêè ?
ConfirmUninstall=Óäàëèòü {#MyAppName} ?

[CustomMessages]
Welcome1=Âàñ ïðèâåòñòâóåò Ìàñòåð óñòàíîâêè èãðû %n«{#MyAppName}»
Welcome2=Ðåêîìåíäóåòñÿ çàêðûòü àíòèâèðóñíûå ïðîãðàììû, à òàêæå âñå ïðî÷èå ïðèëîæåíèÿ ïåðåä òåì, êàê ïðîäîëæèòü.%n%nÍàæìèòå «Äàëåå», ÷òîáû ïðîäîëæèòü, èëè «Îòìåíà», ÷òîáû âûéòè èç ïðîãðàììû óñòàíîâêè.
Dir1=Ïðîãðàììà óñòàíîâèò «{#MyAppName}» â ñëåäóþùóþ ïàïêó.
Dir2=Íàæìèòå «Äàëåå», ÷òîáû ïðîäîëæèòü. Åñëè Âû õîòèòå âûáðàòü äðóãóþ ïàïêó, íàæìèòå «Îáçîð».
FreeSpace=Äîñòóïíî ìåñòà íà äèñêå:.....
NeedSpace=Òðåáóåòñÿ ìåñòà äëÿ óñòàíîâêè:.....
AfterInstallSpace=Ïîñëå óñòàíîâêè èãðà çàéìåò:.....
Fin1=Óñòàíîâêà èãðû «{#MyAppName}» %nóñïåøíî çàâåðøåíà
Fin2=%n%nÄëÿ åå çàïóñêà âûáåðèòå ñîîòâåòñòâóþùèé ÿðëûê â ìåíþ "Ïóñê" %nèëè íà Ðàáî÷åì ñòîëå. %n%nÍàæìèòå "Çàâåðøèòü", ÷òîáû âûéòè èç ïðîãðàììû óñòàíîâêè.
ExtractedFile=Èçâëåêàåòñÿ ôàéë:
Extracted=Óñòàíîâêà...
Error=Îøèáêà ðàñïàêîâêè!
ElapsedTime=Ïðîøëî:
RemainingTime=Îñòàëîñü âðåìåíè:
rbc=Îòêàò óñòàíîâêè...
exit=Âûõîä
Error1=Óñòàíîâêà èãðû «{#MyAppName}» íå çàâåðøåíà.
Error2=%nÂî âðåìÿ óñòàíîâêè ïðîèçîøëà îøèáêà, ïîæàëóéñòà îòêëþ÷èòå ñòîðîííèå ïðîãðàììû è ïîâòîðèòå ïîïûòêó óñòàíîâêè. %n%nÍàæìèòå «Çàâåðøèòü», ÷òîáû âûéòè èç ïðîãðàììû óñòàíîâêè.
ready2=Èíôîðìàöèÿ:
ready3=Èãðà áóäåò óñòàíîâëåíà â

[Run]
Filename: {app}\__Installer\Touchup.exe; Parameters: " install -locale ru_RU -installPath ""{app}\"" -autologging -Opt:InstallPB -startmenuIcon=1 -desktopIcon=1"; WorkingDir: {app}\__Installer

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

[_Code]
const
notPCFonFLY = false;
VK_ESCAPE = 27;

var
img1, img2: longint;
Cancel: Integer;
Error: Boolean;
ISDoneError: Boolean;
PCFVer: Double;
edit, dir, work1, work2, work5, work6, workerror, ready: Longint;
hCancelBtn, hNextBtn, hBackBtn, hDirBrowseBtn, Min, CloseBtn, CancelBtn, MinBtn: HWND;
WFButtonFont: TFont;
UpdBtn: TTimer;
WelcomeLabel1, MainLabel, WelcomeLabel2, dir1,
NeedSpaceLabel, Dir1Label, FreeSpaceLabel, Pct, CurrFileName, Time1, Time2, i, ready1, ready2, ready3, ready9 : TLabel;
FreeMB, TotalMB: Cardinal;
SizeInt: Longint;
Enabled: Boolean;
closebnt: HWND;
TimerID: LongWord;
CurrentPicture:integer;
PicList: TStringlist;
imgpanel: tpanel;

#include "AddIss\botva2.iss"
#include "AddIss\progressbar.iss"

var pb: TImgPB;

function ReleaseCapture: Longint; external 'ReleaseCapture@user32.dll stdcall';

type
TCallback = function (OveralPct, CurrentPct: Integer; CurrentFile, TimeStr1, TimeStr2, TimeStr3: PAnsiChar): longword;
type
TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);
function GetKeyState(nVirtKey: Integer): ShortInt; external 'GetKeyState@user32 stdcall delayload';

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 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 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 SuspendProc: Boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc: Boolean; external 'ResumeProc@files:ISDone.dll stdcall';

procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(WizardForm.Handle,$0112,$F012,0)
end;
function ProgressCallback(OveralPct, CurrentPct: Integer; CurrentFile, TimeStr1, TimeStr2, TimeStr3: PAnsiChar): longword;
begin
if (GetKeyState(VK_ESCAPE) < 0) then begin if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then Cancel:= 1; end;
if OveralPct<=1000 then ImgPBSetPosition(pb, OveralPct);
Pct.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
CurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, CurrFileName.Font, CurrFileName.Width-ScaleX(100));
Time1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
Time2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
Result := Cancel;
end;

procedure CancelButtonOnClick(h: HWND);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then Cancel:= 1;
ResumeProc;
end;

function cm(s: PAnsiChar): String;
begin
Result:= ExpandConstant('{cm:'+s+'}');
end;

procedure HideControls;
begin
Pct.Hide; i.Hide; CurrFileName.Hide; Time1.Hide; Time2.Hide; ImgPBDelete(pb);
if Error then begin i.Show; i.Caption:= cm('rbc'); end;
end;

procedure CreateControls;
begin
Pct := TLabel.Create(WizardForm);
with Pct do begin
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= $363636;
Parent:= WizardForm;
AutoSize:= false;
Left:= ScaleX(350);
Top:= ScaleY(439);
Width:= ScaleX(100);
Transparent:= true;
BringToFront;
end;

CurrFileName := TLabel.Create(WizardForm);
with CurrFileName do begin
Parent:= WizardForm;
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= $363636;
AutoSize:= false;
Width:= ScaleX(300);
Left:= ScaleX(59);
Top:= ScaleY(375);
Transparent:= true;
end;

Time1 := TLabel.Create(WizardForm);
with Time1 do begin
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= $363636;
Parent:= WizardForm;
AutoSize:= false;
Width:= ScaleX(200);
Left:= ScaleX(59);
Top:= ScaleY(390);
Transparent:= true;
end;

Time2 := TLabel.Create(WizardForm);
with Time2 do begin
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= $363636;
Parent:= WizardForm;
AutoSize:= false;
Width:= Time1.Width+ScaleX(40);
Left:= ScaleX(59);
Top:= Time1.Top+ScaleY(15);
Transparent:= true;
end;

i := TLabel.Create(WizardForm);
with i do begin
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= $363636;
Parent:= WizardForm;
AutoSize:= false;
Width:= Time1.Width+ScaleX(40);
Left:= ScaleX(59);
Top:= ScaleY(360);
Transparent:= true;
Caption:= cm('Extracted');
end;
end;

function CheckError: Boolean;
begin
Result:= not Error;
end;
///

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

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\gdiplus.dll')) then ExtractTemporaryFile('gdiplus.dll');
Result:=True;
end;

//************************************************ [Íà÷àëî - Çàãðóçêà èçîáðàæåíèé è ïîäãîòîâêà âèçàðäà] ***************************************************//
procedure CreateWizardImg;
begin
with WizardForm do begin
BorderStyle := bsNone;
ClientWidth:=ScaleX(733);
ClientHeight:=ScaleY(506);
InnerNotebook.Hide;
OuterNotebook.Hide;
Bevel.Hide;
Center;
Color:= $191919;
end;

work1:= ImgLoad(WizardForm.handle, ExpandConstant('2work1.jpg'), ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
work2:= ImgLoad(WizardForm.handle, ExpandConstant('2work2.jpg'), ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
work5:= ImgLoad(WizardForm.handle, ExpandConstant('2work5.jpg'), ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
work6:= ImgLoad(WizardForm.handle, ExpandConstant('2work6.jpg'), ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
workerror:= ImgLoad(WizardForm.handle, ExpandConstant('2workerror.jpg'), ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);

edit:= ImgLoad(WizardForm.handle, ExpandConstant('edit.png'), ScaleX(145), ScaleY(380), ScaleX(328), ScaleY(24), True, True);
dir:= ImgLoad(WizardForm.handle, ExpandConstant('dir.png'), ScaleX(143), ScaleY(327), ScaleX(65), ScaleY(48), True, True);
ImgApplyChanges(WizardForm.Handle);
end;
//************************************************ [Êîíåö - Çàãðóçêà èçîáðàæåíèé è ïîäãîòîâêà âèçàðäà] ***************************************************//

//************************************************ [Íà÷àëî - Òåêñòóðû êíîïîê] ***************************************************//
procedure SetStateNewButtons;
begin
with WizardForm.BackButton do begin
BtnSetText(hBackBtn,PAnsiChar(Caption));
BtnSetVisibility(hBackBtn,Visible);
BtnSetEnabled(hBackBtn,Enabled);
BtnRefresh(hBackBtn);
end;
with WizardForm.NextButton do begin
BtnSetText(hNextBtn,PAnsiChar(Caption));
BtnSetVisibility(hNextBtn,Visible);
BtnSetEnabled(hNextBtn,Enabled);
BtnRefresh(hNextBtn);
end;
with WizardForm.CancelButton do begin
BtnSetText(hCancelBtn, PAnsiChar(cm('exit')));
BtnSetVisibility(hCancelBtn,Visible);
BtnSetEnabled(hCancelBtn,Enabled);
BtnRefresh(hCancelBtn);
end;
BtnSetText(hDirBrowseBtn,PAnsiChar(WizardForm.DirBrowseButton.Caption));
end;

procedure TimerRefreshBtn(S: TObject);
begin
BtnRefresh(hBackBtn);
BtnRefresh(hNextBtn);
BtnRefresh(hCancelBtn);
BtnRefresh(hDirBrowseBtn);
end;

procedure WizardFormBtnClick(hBtn: HWND);
var
Btn:TButton;
begin
case hBtn of
hCancelBtn: Btn:=WizardForm.CancelButton;
hNextBtn: Btn:=WizardForm.NextButton;
hBackBtn: Btn:=WizardForm.BackButton;
hDirBrowseBtn: Btn:=WizardForm.DirBrowseButton;
end;
Btn.OnClick(Btn);
SetStateNewButtons;
BtnRefresh(hBtn);
end;

procedure MinimizeBtnClick(h: HWND);
begin
WizardForm.SetFocus;
ReleaseCapture;
SendMessage(WizardForm.Handle,$112,61472,0);
end;

procedure CancelBtnClick(h: HWND);
begin
WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end;

procedure ButtonsTextures;
begin
WFButtonFont:=TFont.Create;
WFButtonFont.Name:= 'Arial';
WFButtonFont.Height := -13;
WFButtonFont.Color:= $FFFFFF;
WFButtonFont.Style := [fsBold];

with WizardForm.NextButton do begin
hNextBtn:=BtnCreate(WizardForm.Handle, ScaleX(500), ScaleY(470), ScaleX(93), ScaleY(33), 'button.png', 5, False);
BtnSetEvent(hNextBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
BtnSetFont(hNextBtn,WFButtonFont.Handle);
BtnSetFontColor(hNextBtn, $FFFFFF, $FFFFFF, $FFFFFF, $FFFFFF)
Width:=0;
Height:=0;
end;

with WizardForm.BackButton do begin
hBackBtn:=BtnCreate(WizardForm.Handle, ScaleX(400), ScaleY(470), ScaleX(93), ScaleY(33), ExpandConstant('button.png'), 1, False);
BtnSetEvent(hBackBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
BtnSetFont(hBackBtn,WFButtonFont.Handle);
BtnSetFontColor(hBackBtn, $FFFFFF, $FFFFFF, $FFFFFF, $FFFFFF);
Width:=0;
Height:=0;
end;


with WizardForm.CancelButton do begin
hCancelBtn:=BtnCreate(WizardForm.Handle, ScaleX(620), ScaleY(470), ScaleX(93), ScaleY(33), ExpandConstant('button.png'), 1, False);
BtnSetEvent(hCancelBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
BtnSetFont(hCancelBtn,WFButtonFont.Handle);
BtnSetFontColor(hCancelBtn, $FFFFFF, $FFFFFF, $FFFFFF, $FFFFFF);
Width:=0;
Height:=0;
end;

CancelBtn:=BtnCreate(WizardForm.Handle, ScaleX(717), ScaleY(0), ScaleX(11), ScaleY(33), ExpandConstant('exit.png'), 1, False);
BtnSetEvent(CancelBtn, BtnClickEventID,WrapBtnCallback(@CancelBtnClick,1));
BtnSetFont(CancelBtn, WFButtonFont.Handle);
BtnSetText(CancelBtn,'');

MinBtn:=BtnCreate(WizardForm.Handle, ScaleX(704), ScaleY(4), ScaleX(8), ScaleY(33), ExpandConstant('min.png'), 1, false);
BtnSetEvent(MinBtn, BtnClickEventID,WrapBtnCallback(@MinimizeBtnClick,1));

with WizardForm.DirBrowseButton do begin
hDirBrowseBtn:=BtnCreate(WizardForm.Handle, ScaleX(502), ScaleY(375), ScaleX(93), ScaleY(33), ExpandConstant('button.png'), 1, False);
BtnSetEvent(hDirBrowseBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
BtnSetFont(hDirBrowseBtn,WFButtonFont.Handle);
BtnSetFontColor(hDirBrowseBtn, $FFFFFF, $FFFFFF, $FFFFFF, $FFFFFF);
Width:=0;
Height:=0;
end;
end;
//************************************************ [Êîíåö - Òåêñòóðû êíîïîê] ***************************************************//

//************************************************[Íà÷àëî - Ïðîâåðêà ìåñòà íà äèñêå]*************************************************************//
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 CompareNum(FirstNum, SecondNum: Integer): Boolean;
begin
if FirstNum < SecondNum then Result:= False else Result:= True;
end;

Function MbOrTb(Byte: Extended): AnsiString;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' MB' else
if Byte/1024 < 1024 then Result:= NumToStr(round(Byte/1024*100)/100) + ' GB' else
Result:= NumToStr(round((Byte/(1024*1024))*100)/100) + ' TB'
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: AnsiString; gsod: Boolean;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
gsod:= GetSpaceOnDisk(Path, True, FreeMB, TotalMB);

if gsod then begin
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTB(FreeMb) + ' (' + IntToStr((FreeMb*100) div TotalMB) + ' %)';
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt);
BtnSetEnabled(hNextBtn, true);
WizardForm.NextButton.Enabled:= true;
end else

if not gsod then begin
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} 0 MB');
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt)
BtnSetEnabled(hNextBtn, false);
WizardForm.NextButton.Enabled:= false;
Exit;
end;
ready2.Caption:=ready2.Caption + ': ' + WizardForm.DirEdit.Text;
end;

procedure NeedSpace;
begin
SizeInt:= {#NeedSize}

FreeSpaceLabel := TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(145), ScaleY(410), ScaleX(209), ScaleY(13))
FreeSpaceLabel.Parent := WizardForm;
FreeSpaceLabel.Font.Name:='Arial';
FreeSpaceLabel.Font.Size:= 8;
FreeSpaceLabel.Font.Color:= $363636;
FreeSpaceLabel.Transparent:=true;
FreeSpaceLabel.Font.Style := [fsBold];

NeedSpaceLabel := TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(145), ScaleY(430), ScaleX(209), ScaleY(13))
NeedSpaceLabel.Parent := WizardForm;
NeedSpaceLabel.Font.Name:='Arial';
NeedSpaceLabel.Font.Size:= 8;
NeedSpaceLabel.Font.Color:= $363636;
NeedSpaceLabel.Transparent:=true;
NeedSpaceLabel.Font.Style:= [fsBold];

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;
//************************************************[Êîíåö - Ïðîâåðêà ìåñòà íà äèñêå]*************************************************************//

//************************************************ [Íà÷àëî - Ñîçäàíèå ëåáåëîâ] ***************************************************//
procedure CreateLabel;
begin
UpdBtn:= TTimer.Create(nil);
UpdBtn.Interval:= 1;
UpdBtn.OnTimer:= @TimerRefreshBtn;

MainLabel:= TLabel.Create(WizardForm);
with MainLabel do begin
Left:= ScaleX(0);
Top:= ScaleY(7);
Width:= ScaleX(752);
Height:= ScaleY(34);
AutoSize:= false;
Transparent:= true;
WordWrap:= true;
Font.Name:='Corbel';
Alignment:= taCenter;
Font.Size:= 10;
Font.Color:= $aeacac;
Font.Style := [fsBold];
Parent:= WizardForm;
OnMouseDown:=@LabelOnMouseDown;
Caption:= WizardForm.Caption;
end;

WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do begin
Left:= ScaleX(140);
Top:= ScaleY(330);
Width:= ScaleX(450);
Height:= ScaleY(65);
AutoSize:= false;
Transparent:= true;
WordWrap:= true;
Font.Name:='Arial';
Font.Size:= 10;
Font.Color:=$363636;
Font.Style := [fsBold];
Alignment := taCenter;
Parent:= WizardForm;
Caption:= cm('Welcome1');
end;

WelcomeLabel2:=TLabel.Create(WizardForm);
with WelcomeLabel2 do begin
Left:= ScaleX(140);
Top:= ScaleY(370);;
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:='Arial';
Font.Size:= 9;
Font.Color:=$363636;
Alignment := taCenter;
Font.Style := [fsBold];
Transparent:= true;
Parent:= WizardForm;
Caption:= cm('Welcome2');
end;

with WizardForm.DirEdit do begin
Parent:= WizardForm;
Left:= ScaleX(148);
Top:= ScaleY(384);
BorderStyle:= bsNone;
Color:= $ffffff;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:= $363636;
Width:= ScaleX(324);
Height:= ScaleY(18);
end;

dir1:=TLabel.Create(WizardForm);
with dir1 do begin
Left:= ScaleX(300);
Top:= ScaleY(480);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= $363636;
Parent:= WizardForm;
Caption:= cm('dir1');
end;

ready1:=TLabel.Create(WizardForm);
with ready1 do begin
Left:= ScaleX(143);
Top:= ScaleY(370);
Width:= ScaleX(550);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8;
Font.Style := [fsBold];
Transparent:= true;
Font.Color:=$363636;
Parent:= WizardForm;
Caption:= cm('ready2')
end;

ready2:=TLabel.Create(WizardForm);
with ready2 do begin
Left:= ScaleX(160);
Top:= ScaleY(385);
Width:= ScaleX(460);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8;
Font.Style := [fsBold];
Transparent:= true;
Font.Color:=$363636;
Parent:= WizardForm;
Caption:= cm('ready3');
end;
end;
//************************************************ [Êîíåö - Ñîçäàíèå ëåáåëîâ] ***************************************************//

procedure InitializeWizard;
begin
Enabled:= true;
CreateWizardImg;
CreateLabel;
ButtonsTextures;
NeedSpace;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
SetStateNewButtons;
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
BtnSetVisibility(hDirBrowseBtn, false);
ImgSetVisibility(edit, false);
ImgSetVisibility(dir, false);
ImgSetVisibility(work1, false);
ImgSetVisibility(work2, false);
ImgSetVisibility(work5, false);
ImgSetVisibility(work6, false);
ImgSetVisibility(ready, false);
ImgSetVisibility(workerror, false);
WizardForm.DirEdit.Hide;
dir1.Hide;
FreeSpaceLabel.Hide;
NeedSpaceLabel.Hide;
ready1.Hide;
ready2.Hide;

if CurPageID = wpWelcome then
begin
WelcomeLabel1.Show;
WelcomeLabel2.Show;
ImgSetVisibility(work1, true);
ImgSetVisibility(img1, true);
end;

if CurPageID = wpSelectDir then
begin
BtnSetVisibility(hDirBrowseBtn, true);
ImgSetVisibility(edit, true);
ImgSetVisibility(dir, true);
WizardForm.DirEdit.Show;
FreeSpaceLabel.Show;
NeedSpaceLabel.Show;
dir1.Show;
dir1.Caption:= cm('dir1');
dir1.Left:= ScaleX(220);
dir1.Top:= ScaleX(343);
ImgSetVisibility(work2, true);
ImgSetVisibility(img2, true);
end;

if CurPageID = wpInstalling then
begin
ImgSetVisibility(work5, true);
end;

if CurPageID = wpFinished then
begin
ImgSetVisibility(work6, true);
WelcomeLabel1.Caption:= cm('Fin1');
WelcomeLabel2.Caption:= cm('Fin2');
WelcomeLabel2.Top:= WelcomeLabel2.Top-ScaleY(23);
WelcomeLabel1.Show;
WelcomeLabel2.Show;
i.Hide;
end;

if (CurPageID = wpFinished) and Error then
begin
WelcomeLabel1.Caption:= cm('Error1');
WelcomeLabel2.Caption:= cm('Error2')
ImgSetVisibility(workerror, true);
end;
ImgApplyChanges(WizardForm.Handle);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
CreateControls;
pb:= ImgPBCreate(WizardForm.Handle, 'pb1.png','pb.png', ScaleX(59), ScaleY(437), ScaleX(620), ScaleY(19));
BtnSetEvent(hCancelBtn, BtnClickEventID, WrapBtnCallback(@CancelButtonOnClick, 1));
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
Cancel:=0;

ExtractTemporaryFile('unarc.dll');
ExtractTemporaryFile('facompress.dll');

#ifdef records
ExtractTemporaryFile('records.inf');
#endif

Error:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, 0,0,0, 0, 512, @ProgressCallback) then begin
repeat
if not FileSearchInit(true) then break;
// if not ISArcExtract ( 0, 0, ExpandConstant('{src}\disk-1.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
// if not ShowChangeDiskWindow ('Ïîæàëóéñòà, âñòàâüòå âòîðîé äèñê è äîæäèòåñü åãî èíèöèàëèçàöèè.', ExpandConstant('{src}'),'disk-2.bin') then break;
// if not ISArcExtract ( 0, 0, ExpandConstant('{src}\disk-2.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
// if not ShowChangeDiskWindow ('Ïîæàëóéñòà, âñòàâüòå òðåòèé äèñê è äîæäèòåñü åãî èíèöèàëèçàöèè.', ExpandConstant('{src}'),'disk-3.bin') then break;
// if not ISArcExtract ( 0, 0, ExpandConstant('{src}\disk-3.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
// if not ShowChangeDiskWindow ('Ïîæàëóéñòà, âñòàâüòå ÷åòâåðòûé äèñê è äîæäèòåñü åãî èíèöèàëèçàöèè.', ExpandConstant('{src}'),'disk-4.bin') then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\disk-4.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
Error:=false;
until true;
ISDoneStop;
end;
HideControls;
end;
if (CurStep=ssPostInstall) and Error then begin
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;
procedure DeinitializeSetup;
begin
if Enabled then gdipShutdown;
end;


audiofeel 28-07-2013 02:21 2191941

Fakt_37
Цитата:

Цитата Fakt_37
Ребят может вы поможете, возникла такая проблема через SrepInside жму файлы, в батнике пишу arc.exe a -ep1 -dses --dirs -s; -lc- -di -i2 -r -msrep:l256+lzma:a1:mfbt4:d200m:fb128:mc1000:lc8 data.arc packeddata\* (как обычно я делал) но теперь выдаёт ошибку ISDone.dll »

, попробуй новую версию SrepInside0.32 = http://rghost.ru/47598085
и плюс Dll ки от этой версии ISDone 0.6final - for FreeArc Alpha 2012 = http://krinkels.org//downloads.php?do=file&id=110

Fakt_37 28-07-2013 02:37 2191945

Цитата:

Цитата audiofeel
попробуй новую версию SrepInside0.32 »

дело было совсем в другом, я всё это уже пробовал, надо было всего лишь UAC на компе включить)

sergey3695 28-07-2013 11:27 2192037

audiofeel, смотри в function ImgPBCreate
if Length(pb)>0 then Result.img1:=ImgLoad(hParent,pb,Result.Left,Result.Top,Result.Width,Result.Height,True,True) else Result.img1:=0;
if Length(bk)>0 then Result.img2:=ImgLoad(hParent,bk,Left,Top,Width,Height,True,False) else Result.img2:=0;
Последнее значение в ImgLoad
//IsBkg - если IsBkg=True, изображение будет выведено на фоне формы,
// поверх него будут отрисованы графические объекты (TLabel, TBitmapImage и т.д.),
// затем поверх всего будут выведены изображения с флагом IsBkg=False

audiofeel 28-07-2013 12:22 2192055

sergey3695,Или я не понял или надо в другом месте искать, меняю значения с true на false, прогресс бара не видно или вобще не пикчер лейбл не видно и прогресс бара

type
TImgPB = record h: HWND; Left, Top, Width, Height, MaxWidth: Integer; img1, img2: Longint; end;

function ImgPBCreate(hParent: HWND; bk, pb: AnsiString; Left, Top, Width, Height: Integer): TImgPB;
begin
Result.Left:=Left;
Result.Top:=Top;
Result.Width:=0;
Result.Height:=Height;
Result.MaxWidth:=Width;
Result.h:= hParent;
if Length(pb)>0 then Result.img1:=ImgLoad(hParent, pb, Result.Left, Result.Top, 0, Result.Height, True, false) else Result.img1:= 0;
if Length(bk)>0 then Result.img2:=ImgLoad(hParent, bk, Left, Top, Width, Height, True, true) else Result.img2:=0;
ImgApplyChanges(Result.h);
end;

sergey3695 28-07-2013 14:18 2192113

audiofeel, можешь просто скопировать эти две строки
Код:

if Length(pb)>0 then Result.img1:=ImgLoad(hParent,pb,Result.Left,Result.Top,Result.Width,Result.Height,True,True) else Result.img1:=0;
if Length(bk)>0 then Result.img2:=ImgLoad(hParent,bk,Left,Top,Width,Height,True,False) else Result.img2:=0;

и заменить свои. То что написано ниже, это объяснение.

Tima182 28-07-2013 16:10 2192170

Вложений: 1
Помогите так же создать как на скрине?
Мой скрипт:
читать дальше »
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "GTA Criminal Russia"
#define MyAppVersion "1.0"
#define MyAppExeName "gta_sa.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={{FF5A30F3-96DD-40DF-B240-3CEB256CB63F}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName=C:\Games\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputDir=C:\Users\Тима\Desktop
OutputBaseFilename=GTA Criminal Russia
Compression=lzma/ultra
SolidCompression=true
DiskSpanning=true
DiskClusterSize=4096
DiskSliceSize=2000000000

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: C:\Games\GTA Criminal Russia\gta_sa.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Games\GTA Criminal Russia\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; 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

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent

jiumx60rus 28-07-2013 16:24 2192174

Все привет!
Проблема такая: распаковал инновский установщик. Так вот: в нём имеется некая dll-ка, однако в скрипте .iss ничего по этой dll-ке. Даже нет секции [code].
Быть может, кто-нибудь знает, что может быть, каким образом эта длл работает и вызывается.
Спасибо за внимание!

sergey3695 28-07-2013 16:41 2192179

Tima182, это наверное ISFreeArcExtract или IsDone / Ссылка на IsDone (про первое можешь не спрашивать,ты все равно неразберешься,да и IsDone удобней,понятнее и проект развивается)
jiumx60rus, какая .dll (скажите мне про то,незнаю что :lol:)
p.s. скрин свойств библиотеки в студию. (правой кнопкой по файлу -> свойства), тогда возможно кто-то что-то да скажет.
а чуть не забыл. че ты распаковал? можешь сам setup.exe выложить.
jiumx60rus, <Сообщения: 1> !?? тебе готовый скрипт нужен? (Готовые скрипты)

jiumx60rus 28-07-2013 17:05 2192188

sergey3695, спасибо за ответ. Вот http://rghost.ru/47727595 все распакованные файлы, там и сама длл-ка :)

sergey3695 28-07-2013 17:17 2192193

jiumx60rus, у тебя распаковалось все что возможно. значит секции [code] небыло.
acknex.dll - нужна скорее всего для корректной работы игры. (настольного пейнбола).
в гугл вбей и почитай. короче к inno она не относится.

jiumx60rus 28-07-2013 17:25 2192199

sergey3695, Не не, про acknex.dll я знаю, я сам делал эту игру, меня интересует папочка tmp и её itdownload.dll :) Вобщем, при установке игры докачивается и устанавливается один модуль (за который мне платят деньги), вот только интересно, где его поведение прописано :)

На всякий случай, сама установка, где можно посмотреть на это: http://rghost.ru/47728113

Спасибо!

PS: Еще я так понял, файл CompiledCode.bin тоже причастен к этому.

Noname22 28-07-2013 17:50 2192210

Цитата:

Цитата sergey3695
какая .dll (скажите мне про то,незнаю что :lol: ) »

Вы не знали :o, :lol:? А она есть всегда это _shfoldr.dll.

Noname22 28-07-2013 18:07 2192217

Цитата:

Цитата jiumx60rus
и её itdownload.dll »

Эта библиотека касается InnoTools Downloader.

sergey3695 28-07-2013 18:08 2192218

jiumx60rus, itdownload.dll - для скачивания с определенного сайта файлы на комп. примера использования у меня нет,это надо на рубоарде смотреть. да и по правде говоря я никогда ей не пользовался.
CompiledCode.bin - ты извини,но я уже не помню что там находится. Может гуру форума подскажут.
Цитата:

Цитата jiumx60rus
Не не, про acknex.dll я знаю, я сам делал эту игру »

а установщик тогда чей?
-----
Noname22, посмеялись и хватит флудить.

Noname22 28-07-2013 18:11 2192220

Цитата:

Цитата sergey3695
CompiledCode.bin - ты извини,но я уже не помню что там находится. »

Там обычно секция [code] находится, но насчёт расшифровать или открыть пока решения никто не нашёл!

jiumx60rus 28-07-2013 18:11 2192221

Noname22, sergey3695, спасибо за помощь, кстати InnoTools Downloader у меня есть. Только вот странно, почему в самом вкрипте инстальника нигде нету никаких обращений к этой дллке!

Noname22 28-07-2013 18:19 2192225

Цитата:

Цитата jiumx60rus
Только вот странно, почему в самом вкрипте инстальника нигде нету никаких обращений к этой дллке! »

Наверно потому что код не интегрирован в скрипт!?

jiumx60rus 28-07-2013 18:57 2192244

Да ладно :lol:

saurn 28-07-2013 20:41 2192276

jiumx60rus, Noname22, очень содержательные комментарии
jiumx60rus, в {tmp} только одна библиотека - itdownload.dll. Библиотека относится к InnoTools Downloader

Gnom_aka_Lexander 28-07-2013 20:43 2192277

Цитата:

Цитата Noname22
пока решения никто не нашёл! »

отчего-же. какой-то из старых анпакеров имел вкладку просмотра. но без знания ассеблера, там не увидеть ничего интересного. да и смысл? абсолютно все достаточно легко воспроизводимо, к той-же InnoTools Downloader огромная куча примеров, как впрочем и к любой длл-ке написаной специально для inno. все что нужно - побороть лень и открыть пример.

jiumx60rus 28-07-2013 20:59 2192284

saurn, Gnom_aka_Lexander, т.е. всё в моей ситуации разрешимо? Вообще, главное для меня - это сделать так, чтобы эта плюшка, которая докачивается, устанавливалась тихо, без спроса ( :) ), хотя желательно было бы получить её в отделённом виде.

Спасибо всем за ответы, ребятки :)

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

nik1967 28-07-2013 21:00 2192285

Цитата:

Цитата Gnom_aka_Lexander
побороть лень и открыть пример. »

побороть лень и открыть найти пример.
Не всегда пример бывает под рукой :(

Gnom_aka_Lexander 28-07-2013 21:04 2192288

Цитата:

Цитата jiumx60rus
т.е. всё в моей ситуации разрешимо? »

Да. Открываешь пример к InnoTools Downloader и делаешь как тебе нужно.
Цитата:

Цитата jiumx60rus
компилирую его опять и бац! исходный и вновь откомпиленый инстальники не совпадают »

Тебе две страницы уже объясняют, что секция [*Code] не распаковывается. И предвидя вопрос - нет ее достать абсолютно никак, без знаний ассемблера. при наличии таковых знаний - вскрывай файл CompilCode - секция кода там и воспроизводи код по машинному коду. Вскрывать можно прямо нотепадом, там только кодировку подобрать.

Цитата:

Цитата nik1967
Не всегда пример бывает под рукой »

Николай, к InnoTools Downloader идет сразу куча примеров. Плюс примеры почти ко всем длл-кам есть в моей сборке, за что низкий поклон товарищу Edisson009.

jiumx60rus 28-07-2013 21:16 2192296

Цитата:

Цитата Gnom_aka_Lexander
Да. Открываешь пример к InnoTools Downloader и делаешь как тебе нужно. »

Цитата:

Цитата Gnom_aka_Lexander
Тебе две страницы уже объясняют, что секция [*Code] не распаковывается. И предвидя вопрос - нет ее достать абсолютно никак, без знаний ассемблера. при наличии таковых знаний - вскрывай файл CompilCode - секция кода там и воспроизводи код по машинному коду. Вскрывать можно прямо нотепадом, там только кодировку подобрать. »

Gnom_aka_Lexander, ок, допустим с InnoTools Downloader я разберусь, но именно тот файл, который подгружается в установке, что я скидывал, мне уже никак не выдереть оттуда, я так понимаю? И не сделать именно этот инстальник тихим никак, верно? (Ибо всё упирается в этот гадкий CompileCode.bin)

Gnom_aka_Lexander 28-07-2013 21:23 2192300

Цитата:

Цитата jiumx60rus
(Ибо всё упирается в этот гадкий CompileCode.bin) »

нет. все может упираться только в недостаточное количество желания.
Цитата:

Цитата jiumx60rus
но именно тот файл, который подгружается в установке »

либо ищи адрес, откуда он грузится, либо загрузи его на свой сервер и качай itDownloader-ом оттуда.
Цитата:

Цитата jiumx60rus
И не сделать именно этот инстальник тихим никак, верно? »

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

audiofeel 29-07-2013 00:45 2192377

sergey3695,
Цитата:

Цитата sergey3695
audiofeel, можешь просто скопировать эти две строки »

Нет, не выходит,вобще не видно прогресс бара и процентов, делаю как было - прогресс бар видно, но когда он доходит до процентов то "закрывает " их

mat_y@vk 29-07-2013 10:21 2192493

Ребят!
Как можно зашифровать сборку в Инно? Пробовал стандартным способом (через Setup), но и сама сборка не запускается теперь... какие будут советы?

Noname22 29-07-2013 11:10 2192505

Цитата:

Цитата mat_y@vk
Как можно зашифровать сборку в Инно? »

Хелп в шапке. Кстати там есть и второй вариант!
Цитата:

Цитата El Sanchez

От туда приведу первый вариант
  1. Файл ISCrypt.dll копируешь в каталог Inno Setup
  2. В секцию [Setup] добавляешь:
    Код:

    [Setup]
    Encryption=yes
    Password=12345

Всё, после компиляции инсталлятор будет зашифрован.

Encryption Module

sergey3695 29-07-2013 12:33 2192562

audiofeel, кидай сам скрипт (желательно с файлами. можешь зашифровать архив или в лс). мне трудно так ответить. ну, можешь для лейбла с процентами поставить .BringToFront (не факт что поможет).
Или именнно в этих строках поиграйся с последним параметром в ImgLoad / В каком-то случае,да получится. По идеи поставь флаги False,но могу ошибится.

mat_y@vk 29-07-2013 13:31 2192605

Noname22,
Цитата:

Цитата Noname22
От туда приведу первый вариант »

Этот вариант я и пробовал...


Цитата:

Цитата Noname22
Сборник вопросов » »

Он у меня не открылся... все белое... текста нет.

Может скопипастите 2-й вариант?

Noname22 29-07-2013 13:48 2192619

Цитата:

Цитата mat_y@vk
Этот вариант я и пробовал... »

Я же сказал, что там есть второй вариант!
Это вам нужно?
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
Encryption=yes
Password=12345

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


[Code]
procedure InitializeWizard();
var
PasswordEdit: TPasswordEdit;
begin
WizardForm.PasswordEdit.Text := '12345';
end;

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpPassword then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;



Цитата:

Цитата mat_y@vk
Он у меня не открылся... все белое... текста нет.
Может скопипастите 2-й вариант? »

Копирую от туда

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

Цитата Вариант 1
Цитата:

Цитата Ответ
Цитата:

Цитата Вопрос
Как сделать шифрование инсталлятора? А то скачал файл ISCrypt.dll, а как его использовать не знаю...

  1. Файл ISCrypt.dll копируешь в каталог Inno Setup
  2. В секцию [Setup] добавляешь:
Код:

[Setup]
Encryption=yes
Password=12345

Всё, после компиляции инсталлятор будет зашифрован.


Цитата:

Цитата Вариант 2
Цитата:

Шифровка инсталлятора, используя модуль ISCrypt.dll
Представляю свое решение по шифровке инсталлятора, используя модуль ISCrypt.dll, который доступен для скачивания на оф.сайте. Нужно это для того, чтобы обычный пользователь не смог распаковать инсталлятор посредством распаковщика unnounpacker. Смысл такой: задаем пароль для инсталлятора, который автоматически вставляется в поле ввода и посредством специальной функции сама страница нажимается автоматически. Как это делается:

Код:

[Setup]
;Модуль ISCrypt.dll должен быть в папке с компилятором
Encryption=yes
;Пароль сами устанавливаем такой, чтобы никто его не смог подобрать, желательно добавить русские символы и сделать пароль подлиннее
Password=xcvcxhv9-8--fhрлджэ\5(*&Y&&^^()U###$%!^&!^%#^(UJ<:LKJJHGG

[Code]
procedure InitializeWizard();
var
//Определяем поле ввода пароля
PasswordEdit: TPasswordEdit;
begin
//Указываем наш пароль
WizardForm.PasswordEdit.Text := 'xcvcxhv9-8--fhрлджэ\5(*&Y&&^^()U###$%!^&!^%#^(UJ<:LKJJHGG';
end;

//При установке юзер не поймает пароль по маске, который может быть расшифрован специальными утилитами.
//Их у меня нет, но о них я слышал, хотя Inno Setup не позволяет копировать пароль по маске
procedure CurPageChanged(CurPageID: Integer);
begin
If
CurPageID=wpPassword then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;

Имейте в виду, что шифруются только основные файлы.
Кстати, открывал зашифрованный архив плагином для Total Commander и удалось извлечь файл CompiledCode.bin, в котором можно посмотреть пароль. Поэтому рекомендую использовать русские символы в пароле - их (пока) не понимает распаковщик, также, если дальнейшие версии распаковщика будут понимать русский язык - рекомендуется использовать в пароле спец-символы, "крякозябли", ASCII из nfo и т.п.


mat_y@vk 29-07-2013 13:59 2192629

какая разница между
Compression=lzma и Compression=lzma2

Цитата:

Цитата Noname22
Это вам нужно? »

Что-то похоже это страницу с паролем создает... а мне нужно чтобы innounp не распаковывал сборку.

vint56 29-07-2013 14:03 2192636

mat_y@vk используй компилятор от китайцев и все на них унпакера давно нету

Noname22 29-07-2013 14:06 2192641

Цитата:

Цитата mat_y@vk
Что-то похоже это страницу с паролем создает... а мне нужно чтобы innounp не распаковывал сборку. »

Так просто используйте расширеную версию.

mat_y@vk, Скопировал два варианта, всё здесь

mat_y@vk 29-07-2013 14:09 2192642

Цитата:

Цитата Noname22
Так просто используйте расширеную версию. »

Она не собирает мой скрипт :(

UPD. Поставил версию ANSI... собрал.

rezvorck 29-07-2013 14:19 2192646

Добрый день господа знатоки!
Подскажите как заставить загружать текст с файла в Memo во время инсталяции через промежуток времени в замкнутом цикле.
Ниже моя реализация скрипта. Логически все правильно а текст не грузит! (приклеплен downloader - выводит размер файла и состояние в лог, написан на Delphi через Indy, в Dll не силен!)
ссылка на архив

mat_y@vk 29-07-2013 14:28 2192654

Да, кстати, проблема копирования внешней папки на компе решалась простым Flags: external. Вот я ламер.

Ребят... еще такой вопрос... у меня у друга в Европе мой инсталл отображает все симоволы русские крякозябрами... в чем может быть проблема? Языковой пакет у него стоит русский.

Noname22 29-07-2013 14:50 2192667

Цитата:

Цитата mat_y@vk
отображает все симоволы русские крякозябрами »

Смотря какая версия inno используется Unicode или ANSI. Просто может быть так, что скрипт Unicode-ной версии запустили на ANSI и получилась такая бяка
читать дальше »
Код:

[CustomMessages]
russian.NameAndVersion=%1, версия %2
russian.AdditionalIcons=Дополнительные значки:
russian.CreateDesktopIcon=Создать значок РЅР° &Р*абочем столе
russian.CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска
russian.ProgramOnTheWeb=Сайт %1 РІ Р˜РЅС‚РµСЂРЅРµС‚Рµ
russian.UninstallProgram=Деинсталлировать %1
russian.LaunchProgram=Запустить %1
russian.AssocFileExtension=Св&язать %1 с файлами, имеющими расширение %2
russian.AssocingFileExtension=Связывание %1 с файлами %2...
russian.AutoStartProgramGroupDescription=Автозапуск:
russian.AutoStartProgram=Автоматически запускать %1
russian.AddonHostProgramNotFound=%1 не найден в указанной вами папке.%n%nВы всё равно хотите продолжить?

не в тему
Кстати пароль нужен? Вон выше выбирайте любой :teeth:!

mat_y@vk 29-07-2013 14:54 2192669

Noname22, сейчас попробую Unicode собрать.

Ругается на PChar... говорит тип не знает такой.... что делать?

Noname22 29-07-2013 15:00 2192673

mat_y@vk, Может стоит попробовать скрипт открыть в Akelpad с подбором кодировки для прочтения [CustomMessages] если в нём дело!? Если в нём то открыть скрипт, подобрать кодировку, просто скопировать секцию из Akelpad, закрыть скрипт, открыть скрипт в inno а потом вставить скопированное!

vint56 29-07-2013 15:01 2192675

mat_y@vk
type
Pchar =PansiChar;

mat_y@vk 29-07-2013 15:07 2192682

Цитата:

Цитата vint56
type
Pchar =PansiChar; »

ага... уже сам догнал

type
Pchar =PansiChar;

Noname22,
Цитата:

Цитата Noname22
Может стоит попробовать скрипт открыть в Akelpad с подбором кодировки для прочтения [CustomMessages] если в нём дело!? Если в нём то открыть скрипт, подобрать кодировку, просто скопировать секцию из Akelpad, закрыть скрипт, открыть скрипт в inno а потом вставить скопированное! »

Я может не выспался, но этот квест я осилить в воображении не смог.

Цитата:

Цитата Noname22
Кстати пароль нужен? Вон выше под спойлером выбирайте любой ! »

Моя задача решилась просто установкой версии Ultra

mat_y@vk 29-07-2013 15:24 2192698

пересохранил скрипт в Unicode... стало лучше, но не до конца.


Крякозябры идут в том, что описано в секции CODE.

Идеи?

Цитата:

Цитата Noname22
Может стоит попробовать скрипт открыть в Akelpad »

А Notepad++ не подойдет?

Noname22 29-07-2013 15:40 2192720

Цитата:

Цитата mat_y@vk
Крякозябры идут в том, что описано в секции CODE. »

Аналогично, подобрать кодировку, пере копировать надписи!

Цитата:

Цитата mat_y@vk
А Notepad++ не подойдет? »

Подойдёт.

P.S Вы хоть оригинальный файл скрипта сохранили на всякий случай?

mat_y@vk 29-07-2013 15:55 2192739

Цитата:

Цитата Noname22
P.S Вы хоть оригинальный файл скрипта сохранили на всякий случай? »

А Вы вовремя.... я опытный экспериментатор... у меня резервы даже в разных источниках хранятся (диски, флешки, сеть) :)

Проблема решилась кодировкой ANCI и выбором в винде языка системы "русский"

Noname22 29-07-2013 16:07 2192748

Цитата:

Цитата mat_y@vk
я опытный экспериментатор... »

Я на это и надеялся!
Цитата:

Цитата mat_y@vk
Проблема решилась кодировкой ANCI и выбором в винде языка системы "русский" »

На всё, все способы хороши!

alex barmalei 29-07-2013 21:29 2192931

Думаю, что проблема простая, но туплю жестко.
Простая установка программы с выбором компонентов.
Компоненты работают, но проблема вот в чем:
После установки в папке с прогой оказываются файлы компонентов.
Т.е. если я выбираю компонент, то он ставится (myapp.exe), но в папку копируются все компоненты (myapp, 1.exe, myapp, 2.exe).

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

Код:

[Files]
Source: E:\tmp\app\*;  DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

то все работает как надо (естественно непрописаные файлы не копируются).
Похоже надо, чтобы в скрипте был прописан КАЖДЫЙ файл, но их там больше тысячи - руками я замучаюсь.
Как автоматически сделать список ВСЕГО, что есть в сходной папке ?

saurn 29-07-2013 22:39 2192966

Цитата:

Цитата alex barmalei
Как автоматически сделать список ВСЕГО, что есть в сходной папке ? »

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

alex barmalei 29-07-2013 22:47 2192972

saurn, хоть успокоил на счет списка :)

Обычных файлов дофига, компонентов немного.
Вот как выглядит

Код:

[Files]
Source: E:\tmp\app\readme, rus.txt; DestDir: {app}; Flags: ignoreversion external;  DestName: "readme.txt"; Components: lang\rus;
Source: E:\tmp\app\readme, eng.txt; DestDir: {app}; Flags: ignoreversion external;  DestName: "readme.txt"; Components: lang\eng;

[Types]
Name: full; Description: Full installation; Flags: iscustom;

[Components]
Name: "lang"; Description: Мануал; Types: full; Flags: fixed;
Name: "lang\rus"; Description: "Русский";  Flags: exclusive;
Name: "lang\eng"; Description: "English";  Flags: exclusive;

При выборе определенного компонента он ставится, но вместе с ним копируются и исходные, которые копироваться не должны. Может у меня во флагах косяк?

vint56 29-07-2013 22:59 2192982

alex barmalei
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Types]
Name: full; Description: Full installation; Flags: iscustom;

[Components]
Name: "lang"; Description: Мануал; Types: full; Flags: fixed;
Name: "lang\rus"; Description: "Русский"; Flags: exclusive;
Name: "lang\eng"; Description: "English"; Flags: exclusive;

[Files]
Source: rus.txt; DestDir: {app}; DestName: "readme.txt"; Components: lang\rus;
Source: eng.txt; DestDir: {app}; DestName: "readme.txt"; Components: lang\eng;

saurn 29-07-2013 23:19 2192995

alex barmalei, с флагами все нормально, кроме флага external, если планируете его использовать, то путь к устанвливаемым файлам нужно указывать не абсолютный, а через константу, например Source: {src}\tmp\app\readme, rus.txt;, где {src} корневая папка инстала. Что касается установки других фалов вместе с выбранными компонентами, то, могу лишь предположить, что ниже в секции файлов имеется строка, которая берет файлы из тойже папки по маске, если да, то она и переписывает условия описаные выше. В данном случае, как я и говорил, нужно раскидывать файлы по каталогам, или использовать параметр Excludes, например Source: app\*; Exludes: rus.txt, eng.txt; DestDir: {app}; Flags: ignoreversion;, но этот параметр не комбинируется с флагом external.

jiumx60rus 29-07-2013 23:20 2192997

Цитата:

Цитата Gnom_aka_Lexander
либо ищи адрес, откуда он грузится, либо загрузи его на свой сервер и качай itDownloader-ом оттуда. »

Сам адрес-то и прописан в CompileCode.bin, так что узнать его невозможно.

Цитата:

Цитата Gnom_aka_Lexander
раз родным инсталлятором он устанавливается по тихому, то логично предположить, что у него есть ключи тихой установки. про эти ключи можно почитать на сайте oszone.net в разделе справки про автоматическую установку Windows. »

Как раз-таки родным и не тихо он устанавливается, это мне надо сделать тихую установку :)

В общем я уже понял, что то, что я задумал, неосуществимо, тогда еще есть такой вопросик: ключи /silent не работают при подключенном интернете (установка заканчивается не начавшись), а при выключенном работают. Это связано с тем, что в процессе установки докачивается файлик. Так вот, можно ли это исправить?

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

alex barmalei 30-07-2013 00:07 2193026

saurn, ок, будут проверять.
А Excludes с абсолютными путями работает?

Johny777 30-07-2013 03:03 2193053

jiumx60rus, Если я правильно понимаю тебе нужно скачать инсталл из интернета и тихо установить.
Вопросъ: Нафига тебе далась эта библиотека itdownload.dll ? Ведь фиг знает что там внутри
_ В шапке функция скачивания El Sanchez-а, ""Загрузка файла из Интернет"" http://forum.oszone.net/post-1930003-232.html
_ Вот её обновлённая/доработанная версия http://forum.oszone.net/post-2149513-443.html
_ До кучи ещё простая функция скачивания файла без каллбэка function DownloadFile(const URL, FileName: String): Boolean; http://forum.oszone.net/post-2099033-1730.html
=================
касательно тихой установки вот тебе код. Сделал так чтоб можно было тихо и обычно установить.
Чтоб была тихая установка запускаешь инсталл с параметром ком строки из под константы VERY_SILIENT_PARAM. Можешь свой параметр придумать, если хочешь :)

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

#define A = (Defined UNICODE) ? "W" : "A"

const
   
GCL_STYLE = -26;
    CS_NOCLOSE = $200;
    WM_LBUTTONDOWN = $0201;
    WM_LBUTTONUP = $0202;
   
    VERY_SILIENT_PARAM = '-!VerySilient!';


var
   
VerySilient: Boolean;


function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@User32.dll stdcall';
function SetClassLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): DWORD; external 'SetClassLong{#A}@User32.dll stdcall';
function GetClassLong(hWnd: HWND; nIndex: Integer): DWORD; external 'GetClassLong{#A}@User32.dll stdcall';


procedure InitializeWizard();
begin
   
VerySilient := Pos(VERY_SILIENT_PARAM, GetCmdTail) <> 0;
    if VerySilient then
    begin
       
ShowWindow(Application.Handle, SW_HIDE); // прячем кнопку в панели задач
       
SetClassLong(WizardForm.Handle, GCL_STYLE, GetClassLong(WizardForm.Handle, GCL_STYLE) or CS_NOCLOSE); // без Alt+F4

        // прячем форму
       
WizardForm.BorderStyle := bsNone;
        WizardForm.SetBounds(Screen.Width-777, Screen.Height-777, 0, 0);
    end;
end;




procedure CurPageChanged(CurPageID: Integer);
begin
    if
CurPageID = wpReady then if VerySilient then
    begin
       
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
        PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
    end;
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageID of
       
wpWelcome, wpSelectDir, wpFinished {, другие твои страницы}: Result := VerySilient;
    end;
end;


procedure DeinitializeSetup();
begin
   
/MsgBox('Installed', mbInformation, MB_OK);
end;


Noname22 30-07-2013 05:17 2193059

Цитата:

Цитата jiumx60rus
Сам адрес-то и прописан в CompileCode.bin»

Люди умудряются от туда пароли вытаскивать:
Цитата:

Цитата Noname22
удалось извлечь файл CompiledCode.bin, в котором можно посмотреть пароль. »


mat_y@vk 30-07-2013 09:13 2193110

Господа!
А есть ли возможность проверять перед установкой правильность выбора папки установки (когда файлы накатываются на установленную программу)?
Например, проверять в папке установки наличие какого либо файла?

alex barmalei 30-07-2013 09:33 2193120

saurn, Excludes помог, благодарствую.

Noname22 30-07-2013 09:50 2193126

Цитата:

Цитата mat_y@vk
Например, проверять в папке установки наличие какого либо файла? »

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

[Code]
var Flag: boolean;
function InitializeSetup: Boolean;
begin
Flag:= True;
Result:=true;
if not FileExists(ExpandConstant('{pf}')+'\My Program\MyProg.exe')
then
begin
MsgBox('На вашей системе не обнаружена My Program! Сначала установите My Program, затем начните установку заново.', mbInformation, MB_OK);
Flag:= False;
Result:=false;
end;
end;


mat_y@vk 30-07-2013 11:44 2193183

Noname22, вставил вот так:
Код:

var Flag: boolean;
function InitializeSetup: Boolean;
begin
Flag:= True;
Result:=true;
if not FileExists(ExpandConstant('{app}')+'\res\resources.xml')
then
begin
MsgBox('На вашей системе не обнаружена My Program! Сначала установите My Program, затем начните установку заново.', mbInformation, MB_OK);
Flag:= False;
Result:=false;
end;
end;

Получаю ошибку


пробовал разные имена файлов и разные папки... что ему не нравится в app???

Mailchik 30-07-2013 11:57 2193185

mat_y@vk, константа {app} действительна после страницы SelectDir. На этапе инициализации она не известна, вот и ошибка.

alex barmalei 30-07-2013 11:58 2193186

Подскажите, как называются эти линии, чтобы можно было к ним обратится через WizardForm?
Хочу у них цвет поменять.

nik1967 30-07-2013 12:00 2193190

mat_y@vk, пишет, что пытаетесь применить константу "app" прежде, чем она была инициализирована. По русски - пытаешься применить константу "app" до того, как инсталлятор её получит. Это делается на SelectDirPage в function NextButtonClick(CurPageID: Integer): Boolean;

mifkys 30-07-2013 12:02 2193193

Цитата:

Цитата El Sanchez
Цитата mifkys:
Можно ли во время установки после каждой записи в блоке [Run] выводить окно о запросе на продолжение установки, чтобы пользователь сам нажимал "Далее" »
mifkys, можно. Вопрос в том, что делать, если пользователь не захочет продолжать. В таком случае прервать работу установщика не удасться. »

Добрый день. Все-таки нужно отменить установку в случае, если пользователь нажмет "Отмена". Это как-то можно реализовать?

В секции [Run] у меня по очереди запускаются приложения, но на 4 файле мне нужно вывести окно, которое остановит продолжение установки до тех пор, пока пользователь не нажмет "ОК". Если же он нажмет "Отмена", то установка должна быть отменена. Сам инсталлятор работает с флагом Uninstallable=no, т.е. в portable режиме, поэтому прерывание установки мне не страшно. Окно я вывел через процедуру BeforeInstall на нужном файле, но
Код:

CancelWithoutPrompt := true;
WizardForm.Close;

не помогает. Что можно придумать? Не уже ли придется все описывать в секции [code]?

nik1967 30-07-2013 12:05 2193195

alex barmalei, они называются Bevel и Bevel1, и у них есть только свойства Shape: и Style:. Свойства Color у них нет.

alex barmalei 30-07-2013 12:19 2193210

nik1967, ну хоть что-то, спасибо.

mat_y@vk 30-07-2013 12:40 2193224

nik1967, а м
Цитата:

Цитата nik1967
mat_y@vk, пишет, что пытаетесь применить константу "app" прежде, чем она была инициализирована. По русски - пытаешься применить константу "app" до того, как инсталлятор её получит. Это делается на SelectDirPage в function NextButtonClick(CurPageID: Integer): Boolean; »

А можно это показать как пишется правильно?

Я вот что-то не пойму... в какое место в таком виде это надо вставить

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

///////////////////////////////////////Изоображения///////////////////////////////////////////////
procedure InitializeWizard1();
begin
ExtractTemporaryFile('{#FinishImage}');

WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\{#FinishImage}'));

WelcomeLabel:= TLabel.Create(WizardForm);
WelcomeLabel.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
WelcomeLabel.SetBounds(Left-70, Top-30, Width, Height);
WelcomeLabel.Alignment := taCenter;
WelcomeLabel.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel.Font.Color:= clWhite;
WelcomeLabel.Font.Size:=12
WelcomeLabel.Transparent:= True;
WelcomeLabel.WordWrap:= true;
WelcomeLabel.Caption:= ExpandConstant('{cm:WelcomeLabel}');
WelcomeLabel.Parent:= WizardForm.WelcomePage
WelcomeLabel.Font.Style:=[fsBold];

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
FinishedLabel.SetBounds(Left-70, Top+70, Width, Height);
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Caption:=ExpandConstant('{cm:FinishLabel}');
FinishedLabel.Parent:= WizardForm.FinishedPage
FinishedLabel.Font.Style:=[fsBold];
FinishedLabel.Alignment := taCenter;
FinishedLabel.Font.Size:=10;

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;

/////////////////////////////////

procedure InitializeWizard2();
begin
WizardForm.MainPanel.Height:=150;
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+50, Width, Height);
PageNameLabel.Transparent:= True;
PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
PageNameLabel.Font.Color:= clWhite;  //цвет надписи
PageNameLabel.Parent:= WizardForm.MainPanel;

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

///////////////////////////////////////Изоображения///////////////////////////////////////////////

WizardForm.ComponentsList.Color:=WizardForm.SelectDirPage.Color
WizardForm.BackButton.Left:=0;
WizardForm.NextButton.Left:=WizardForm.CancelButton.Left+10;
WizardForm.NextButton.Top:=WizardForm.Bevel.Top+5;
WizardForm.NextButton.Height:=40;
WizardForm.BackButton.Top:=WizardForm.Bevel.Top+5;
WizardForm.BackButton.Height:=40;
WizardForm.SelectDirBrowseLabel.Hide;
WizardForm.CancelButton.Height:=40;
WizardForm.CancelButton.Top:=WizardForm.Bevel.Top+5;
WizardForm.CancelButton.Left:=WizardForm.CancelButton.Left+10;
WizardForm.CancelButton.Hide;
WizardForm.SelectDirBitmapImage.Hide
WizardForm.SelectGroupBitmapImage.Hide
WizardForm.SelectDirLabel.Left:=WizardForm.SelectDirBitmapImage.Left
WizardForm.SelectDirLabel.Top:=100
WizardForm.DirEdit.Top:=140
WizardForm.DirBrowseButton.Top:=140
WizardForm.GroupEdit.Top:=140
WizardForm.GroupBrowseButton.Top:=140
WizardForm.SelectComponentsLabel.Hide;
WizardForm.ComponentsDiskSpaceLabel.Hide;
WizardForm.SelectStartMenuFolderBrowseLabel.Hide;
WizardForm.SelectStartMenuFolderLabel.Left:=WizardForm.SelectDirBitmapImage.Left;
WizardForm.SelectStartMenuFolderLabel.Top:=100;
WizardForm.SelectTasksLabel.Hide;
WizardForm.ComponentsList.Top:=100;
WizardForm.ComponentsList.Height:=120;
WizardForm.TasksList.Top:=100;
WizardForm.TasksList.Height:=120;
WizardForm.LicenseMemo.Height:=110;
WizardForm.LicenseMemo.Top:=85;
WizardForm.StatusLabel.Top:=100;
end;

///////////////////////////////////////ISDone////////////////////////
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;
  LabelTime1.Hide;
  LabelTime2.Hide;
  MyCancelButton.Hide;
end;

procedure CreateControls;
var PBTop:integer;
begin
  PBTop:=ScaleY(50);
  ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar1 do begin
    Parent  := WizardForm;
    Height  := WizardForm.CancelButton.Height-10
    Left    := ScaleX(0);
    Top      := WizardForm.BackButton.Top+5;
    Width    := ScaleX(405);
    Max      := 1000;
  end;
  LabelPct1 := TLabel.Create(WizardForm);
  with LabelPct1 do begin
    Parent    := ISDoneProgressBar1;
    AutoSize  := True;
    Left      := 10;
    Top      := 3;
    Font.Size := 14;
    Width    := ScaleX(80);
    Transparent:=True;
  end;
  LabelTime1 := TLabel.Create(WizardForm);
  with LabelTime1 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width div 2;
    Left    := ScaleX(0);
    Top      := 200;
  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;
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.Height:=30;
    WizardForm.ProgressGauge.Top:=150;
    WizardForm.CancelButton.Hide;
    CreateControls;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

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


    ISDoneError:=true;
 
    HideControls;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
//    BtnPanel.Show;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;
/////////////////////////////////////////////ISDone/////////////////////







procedure InitializeWizard();
begin
    MyCancelButton:=TNewButton.Create(WizardForm);
    with MyCancelButton do begin
    Parent:=WizardForm;
    Width:=WizardForm.CancelButton.Width;
    Caption:='Отмена';
    Left:=WizardForm.CancelButton.Left+10;
    Height:=40;
    Top:=WizardForm.Bevel.Top+5;
    OnClick:=@CancelButtonOnClick;
  // Необходимо добавлять каждую кнопку расположенную на стекле
  // до инициализации стекла для того что бы не было дыр ))
  iswin7_add_button(WizardForm.BackButton.Handle);
  iswin7_add_button(WizardForm.NextButton.Handle);
  iswin7_add_button(WizardForm.CancelButton.Handle);
  iswin7_add_button(MyCancelButton.Handle);
  // Параметр True не трогать он для htuos ))
  iswin7_add_glass(WizardForm.Handle, 0, 0, 0, 47, True);
end;
  InitializeWizard1();
  InitializeWizard2();

  #ifdef ComponentsInfo
  InitializeWizard4();
  #endif
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
#ifdef CancelOnWelcome
 if CurPageID = wpWelcome then
 begin
  WizardForm.CancelButton.Left:=0;
end;
 if CurPageID = wpsELECTdIR then
 begin
  WizardForm.CancelButton.Left:=WizardForm.NextButton.Left;
 end;
#endif
 if CurPageID = wpSelectTasks then
 begin
  WizardForm.NextButton.Caption:='Установить';
end;
// if CurPageID = wpInstalling then
// begin
//  BtnPanel.Hide;
//end;
  MyCancelButton.Hide;
if CurPageID = wpInstalling then
 begin
  MyCancelButton.Show;
end;


saurn 30-07-2013 13:59 2193282

mat_y@vk
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result := True;

    case CurPageID of
        wpSelectDir:
        begin
            Result := FileExists(ExpandConstant('{app}\res\resources.xml');
            if not Result then MsgBoxEx(WizardForm.Handle, 'Ошибка! Приложение' + #32 + ExpandConstant('{#SetupSetting("AppName")}') + #32 + 'не найдено на данном компьютере', 'Ошибка', MB_OK or MB_ICONWARNING, 0, 0);
        end;
    end;
end;


alex barmalei 30-07-2013 14:09 2193289

Классный форум :)
Как форсировать создание иконки на рабочем столе и пропустить страницу дополнительных задач?

[Tasks] У меня пустой.


Код:

[Icons]
Name: "{commondesktop}\program"; Filename: "{app}\myapp.exe";

И второе: Можно ли добавить на страницу выбора директории отображение свободного места?

mat_y@vk 30-07-2013 14:19 2193296

Цитата:

Цитата alex barmalei
Как форсировать создание иконки на рабочем столе и пропустить страницу дополнительных задач? »

Код:

Name: {userdesktop}\Имя иконки; IconFilename: {app}\ProgName.exe; Filename: {app}\ProgName.exe; Flags: createonlyiffileexists; Check: CheckError
saurn, низкий поклон Вам. Работает!

alex barmalei 30-07-2013 14:32 2193310

mat_y@vk, я наврал, Tasks не был пустой и в нем было прописано создание иконки. :)
Все работает.

mat_y@vk 30-07-2013 14:40 2193320

----------------------------
Одной проблемой меньше, но появился новый вопрос:

Я нашел ключ на Unninstal к установленной игре в реестре, вот он:

AppId={{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}

На всех моих компах (везде Вин 7 х32 и х64) по этому AppId установщик находит верный путь... но некоторые люди жалуются, что он сам не находит путь... есть ли способ еще как-то искать путь к программе установленной уже? Может по имени exe'шника или еще чего в реестре поискать? Или скрипт какой...

Noname22 30-07-2013 15:28 2193351

Цитата:

Цитата mat_y@vk
есть ли способ еще как-то искать путь к программе установленной уже? »

например в секцию [Setup]

Через информацию деинсталляции
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("Введите_сюда_AppID")}_is1,InstallLocation|{pf}\My Program}


Только учтите, Inno создаёт AppId такого рода {AppId}_is1, так же может быть название приложения вместо AppId, другие программы могут создавать так {AppId}, а могут без AppId, вместо него название приложения.

И одного AppId мало, в информации деинсталляции например может быть прописан и путь к приложению, например InstallLocation. Если же имеется вообще, поскольку может быть и не прописан.




Через информацию установленного приложения, например по \SOFTWARE\Ваша_программа

это общая
Код:

HKLM\SOFTWARE\Ваша_программа
это пользовательская
Код:

HKCU\SOFTWARE\Ваша_программа
читать дальше »
Код:

AppName=My Program
AppVersion=1.5
DefaultDirName={reg:HKLM\SOFTWARE\KLCodecPack,installdir|{pf}\My Program}


Johny777 30-07-2013 15:42 2193362

mat_y@vk, Немного теории. Установка как таковая состоит из 2 действий:
1. Копирование чего надо куда надо
2. Создание ключа в реестре и внос туда стандартных подключей. Нпример раздел HKEY_CURRENT_USER,
ключ 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Твой_апп_айди';

Имена подключей неизменяемы и заложены майкрософтом. Вот тут стандартные имена, но не все http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx Нет например DisplayIcon
По этим значениям этих подключей заполняется инфа в списке "программы и компонеты". Как минимум нужны UninstallString и DisplayName чтоб твоя программа появилась в списке.

Для удаления программы достаточно удалить ключ 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Твой_апп_айди';

Ты наверное уже понял что единственный путь к экзешнику, который всегда лежит в реестре = путь к программе удаления.
Да ты можешь внести другие ключи со своими значениями, но это зависит от автора инсталла и полагаться на это нельзя.
Искать по DisplayName тоже не получится. Кто-то может назвать игру "Super World of Tanks". Да здесь мы видим ещё и "World of Tanks" в названии. А что если она будет называться так "WoTv1.1.0"? Короче тоже не вариант
Искать экзешник на компе не проблема - так ты найдёшь путь. Только вот искать придётся по всему компу а это может быть очень долго, ведь нельзя полагаться что игра стоит в Program Files

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

mat_y@vk 30-07-2013 15:58 2193375

Johny777, Noname22, ясно.
А этот AppId не зависит от установленной винды? Ну типа на ХР он отличается от AppId на Вин7 или 8.

У меня еще вопрос... как можно добавить свои кнопки на 1 страницу со ссылкой в сеть... обязательно botva.dll? Или есть более простой способ?

У меня просто тут засада какая-то... ни один фаил справки не открывается... точнее открывается, а текста нет... уже все решения сайта MS попробовал... ничего (Win 7 x86 ultra)

Noname22 30-07-2013 16:01 2193381

Цитата:

Цитата Johny777
Для удаления программы достаточно удалить ключ 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Твой_апп_айди'; »

Для справки: Это лишь удалит информацию о установленной программе, но не саму программу. Т.е информация что в системе эта программа не установлена будет ложной, на самом деле программа будет всё равно установлена, поскольку могут быть зарегистрированы какие либо элементы, установлены сертификаты/цифровая подпись, внесены разнообразные ключи реестра и т.д. и т.д. и т.п. Удалением программы управляет сам деинсталлятор и то не полностью.

Вот бывает говорят, программа полностью portable, не оставляет ничего после себя в реестре. Не верно, всё равно оставляет запись о том что эта программа запускалась.

saurn 30-07-2013 16:05 2193382

mat_y@vk, добавлю к выше сказанному: можно написать функцию, которая будет искать каталог с игрой по заданому заранее ID с результатом на выходе. Если все условия описаные в функции будут соблюдены, выдирать из реестра путь к целевой папке и использовать его в качестве пути установки, соответственно. А результат возвращаемый функцией использовать для пропуска страницы выбора папки установки. Для большей информативности можно добавить MsgBox с сообщением типа " программа успешно обнаружена, ля-ля, тополя...". Если же функция вернет отрицательный результат, то тогда уже предоставлять пользователю возможность самому указать путь к папке.

Noname22 30-07-2013 16:20 2193395

Цитата:

Цитата mat_y@vk
А этот AppId не зависит от установленной винды? »

На сколько знаю нет!

Цитата:

Цитата mat_y@vk
У меня еще вопрос... как можно добавить свои кнопки на 1 страницу со ссылкой в сеть... »

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

[Code]
var
  SiteButton: TNewButton;
  SiteOpenButton: Integer;

procedure SiteButtonClick(Sender: TObject); forward;

procedure InitializeWizard();
begin
  SiteButton := TNewButton.Create(WizardForm);
  with SiteButton do
  begin
    Parent := WizardForm;
    Left := ScaleX(16);
    Top := ScaleY(327);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Мой сайт';
    OnClick := @SiteButtonClick;
  end;
end;

procedure SiteButtonClick(Sender: TObject);
begin
ShellExec('open', 'http://www.сайт.com/', '', '', SW_SHOWNORMAL, ewNoWait, SiteOpenButton)
end;



Цитата:

Цитата mat_y@vk
обязательно botva.dll? »

Нет!

saurn 30-07-2013 16:48 2193420

Цитата:

Цитата mat_y@vk
как можно добавить свои кнопки на 1 страницу со ссылкой в сеть »

*UPD
Пример
Код:

[Code]
var
   
urlBtn, addBtn: TButton;


procedure urlOpen(Sender: TObject);
var
   
i: Integer;
begin
    case
TButton(Sender).Tag of
       
0: ShellExec('open', 'http://www.oszone.net/', '', '', 5, ewNoWait, i); //Действие для первой кнопки
       
1: ShellExec('open', 'http://www.oszone.net/', '', '', 5, ewNoWait, i); //Действие для второй
   
end;
end;

procedure InitializeWizard();
begin
    with
WizardForm do
    begin
       
urlBtn := TButton.Create(nil); //Первая кнопка
       
with urlBtn do
        begin
           
Parent := WizardForm;
            SetBounds(ScaleX(12), NextButton.Top, NextButton.Width, NextButton.Height);
            Tag := 0;
            Caption := 'Веб - сайт';
            OnClick := @urlOpen;
        end;

        addBtn := TButton.Create(nil); //Вторая
       
with addBtn do
        begin
           
Parent := WizardForm;
            SetBounds(urlBtn.Left *8, urlBtn.Top, urlBtn.Width, urlBtn.Height);
            Tag := 1;
            Caption := 'Имя кнопки';
            OnClick := @urlOpen;
        end;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
   
urlBtn.Hide;
    addBtn.Hide;

    case CurPageID of
       
wpWelcome:
        begin
           
urlBtn.Show;
            addBtn.Show;
        end;
    end;
end;



Кнопки показывается только на станице приветствия - на остальных скрыты. Насколько я понял, именно это и нужно.

mat_y@vk 30-07-2013 17:07 2193433

Noname22, saurn, а если 2 кнопки, то просто 2 раза это описывать с разными координатами?

saurn 30-07-2013 17:21 2193440

Цитата:

Цитата mat_y@vk
а если 2 кнопки, то просто 2 раза это описывать с разными координатами? »

С разными координатами и с разными действиями в обработчике OnClick. Обновленный пример постом выше.

Noname22 30-07-2013 20:06 2193542

Цитата:

Цитата mat_y@vk
а если 2 кнопки »

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

[Code]
var
  SiteButton1, SiteButton2: TNewButton;
  SiteOpenButton1, SiteOpenButton2: Integer;
 
procedure SiteButton1Click(Sender: TObject); forward;
procedure SiteButton2Click(Sender: TObject); forward;

procedure InitializeWizard();
begin
  SiteButton1 := TNewButton.Create(WizardForm);
  SiteButton1.Parent := WizardForm;
  SiteButton1.Left := ScaleX(8);
  SiteButton1.Top := ScaleY(327);
  SiteButton1.Width := ScaleX(75);
  SiteButton1.Height := ScaleY(25);
  SiteButton1.Caption := 'Мой сайт 1';
  SiteButton1.OnClick := @SiteButton1Click;

  SiteButton2 := TNewButton.Create(WizardForm);
  SiteButton2.Parent := WizardForm;
  SiteButton2.Left := ScaleX(88);
  SiteButton2.Top := ScaleY(327);
  SiteButton2.Width := ScaleX(75);
  SiteButton2.Height := ScaleY(25);
  SiteButton2.Caption := 'Мой сайт 2';
  SiteButton2.OnClick := @SiteButton2Click;
end;

procedure SiteButton1Click(Sender: TObject);
begin
ShellExec('open', 'http://www.мойсайт1.com/', '', '', SW_SHOWNORMAL, ewNoWait, SiteOpenButton1)
end;

procedure SiteButton2Click(Sender: TObject);
begin
ShellExec('open', 'http://www.мойсайт2.com/', '', '', SW_SHOWNORMAL, ewNoWait, SiteOpenButton2)
end;


nik1967 30-07-2013 21:23 2193590

Цитата:

Цитата mat_y@vk
У меня просто тут засада какая-то... ни один фаил справки не открывается... точнее открывается, а текста нет... »

Правой кнопкой на файл справки => разблокировать => применить.

mat_y@vk 31-07-2013 09:56 2193793

Цитата:

Цитата nik1967
Правой кнопкой на файл справки => разблокировать => применить. »

Век живи - век учись! Работает!

Fakt_37 31-07-2013 23:32 2194311

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

Noname22 01-08-2013 02:00 2194344

Цитата:

Цитата Fakt_37
а как сделать чтоб внизу самого обычного инсталятора была ссылка на сайт? »

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

[Code]
var
  OpenURL: TNewStaticText;
  ErrorOpenURL: Integer;

procedure OpenURLClick(Sender: TObject); forward;
procedure InitializeWizard();
begin
  OpenURL := TNewStaticText.Create(WizardForm);
  OpenURL.Parent := WizardForm;
  OpenURL.Cursor := crHand;
  OpenURL.Caption := 'Мой сайт';
  OpenURL.OnClick := @OpenURLClick;
  OpenURL.Left := ScaleX(16);
  OpenURL.Top := ScaleY(336);
  OpenURL.Width := ScaleX(60);
  OpenURL.Height := ScaleY(14);
  OpenURL.Font.Color := clBlue;
  OpenURL.Font.Style := OpenURL.Font.Style + [fsUnderline];
end;

procedure OpenURLClick(Sender: TObject);
begin
ShellExec('open', 'http://www.мойсайт.com/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorOpenURL);
end;


El Dog 02-08-2013 09:38 2195010

Всем лапа. Почитал. Зделал через визуальный редактор вот это [ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030102A03000054504630F10B5457697A617264466F726D0A57697A61726 4466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C656674020 00B4578706C69636974546F7002000D4578706C69636974576964746803F9010E4578706C69636974486569676874038A010 D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724 E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D6550616765084E65787450616765070D4 953437573746F6D50616765310D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F 110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6 963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6 F7465626F6F6B506167650B4C6963656E7365506167650C50726576696F757350616765070D4953437573746F6D506167653 10D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED00000010544E65774E6F7465626F6F6 B506167650D4953437573746F6D50616765310743617074696F6E06154953437573746F6D50616765315F43617074696F6E0 B4465736372697074696F6E06194953437573746F6D50616765315F4465736372697074696F6E0C50726576696F757350616 765070B57656C636F6D6550616765084E65787450616765070B4C6963656E736550616765000E544E6577537461746963546 578740E4E65775374617469635465787431044C656674021003546F700210055769647468024D06486569676874020E07436 17074696F6E060E4E65775374617469635465787431085461624F72646572020000000E544E6577537461746963546578740 E4E65775374617469635465787432044C656674021003546F700210055769647468024D06486569676874020E07436170746 96F6E060E4E65775374617469635465787432085461624F72646572020100000000000000

[code]
{ RedesignWizardFormBegin } // Не удаляйте эту строку!
// Не изменяйте эту секцию. Она создана автоматически.
var
ISCustomPage1: TWizardPage;
NewStaticText1: TNewStaticText;
NewStaticText2: TNewStaticText;

procedure RedesignWizardForm;
begin
{ Creates custom wizard page }
ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

{ NewStaticText1 }
NewStaticText1 := TNewStaticText.Create(WizardForm);
with NewStaticText1 do
begin
Parent := ISCustomPage1.Surface;
Caption := 'NewStaticText1';
Left := ScaleX(16);
Top := ScaleY(16);
Width := ScaleX(77);
Height := ScaleY(14);
end;

{ NewStaticText2 }
NewStaticText2 := TNewStaticText.Create(WizardForm);
with NewStaticText2 do
begin
Parent := ISCustomPage1.Surface;
Caption := 'NewStaticText2';
Left := ScaleX(16);
Top := ScaleY(16);
Width := ScaleX(77);
Height := ScaleY(14);
end;

NewStaticText1.TabOrder := 0;
NewStaticText2.TabOrder := 1;

{ ReservationBegin }
// В этом месте вы можете добавить свой код.

{ ReservationEnd }
end;
// Не изменяйте эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удаляйте эту строку!

procedure InitializeWizard();
begin
RedesignWizardForm;
end;

незнаю что делать дальше

мне нужно чтоб при нахождении [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip]
"DisplayName"="7-Zip 22"

высвечивалась Caption := 'NewStaticText1' а 'NewStaticText2' скрылся

если "DisplayName"="7-Zip 22" нету высвечивалась Caption := 'NewStaticText2' и скрывался 'NewStaticText1'
как зделать помогите

alert30 02-08-2013 11:15 2195059

El Dog, ваш код спрячьте под спойлер.

saurn 02-08-2013 12:38 2195123

Цитата:

Цитата El Dog
высвечивалась Caption := 'NewStaticText1' а 'NewStaticText2' скрылся »

В этом случае не обязательно манипулировать с контролами, можно просто изменять Caption в зависимости от значения в реестре.
Пример
Код:

[Code]
var
   
ISCustomPage1: TWizardPage;
    NewStaticText1: TNewStaticText;


procedure RedesignWizardForm();
begin
   
ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

    NewStaticText1 := TNewStaticText.Create(WizardForm);
    with NewStaticText1 do
    begin
       
Parent := ISCustomPage1.Surface;
        Caption := 'NewStaticText1';
        Left := ScaleX(16);
        Top := ScaleY(16);
        Width := ScaleX(77);
        Height := ScaleY(14);
    end;
end;


procedure InitializeWizard();
begin
   
RedesignWizardForm();
end;


function CompareRegValue(const Value: String): Boolean;
var
   
sResult: String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip', Value, sResult);
    if (sResult = '7-Zip 22') then NewStaticText1.Caption := 'Имя 7-Zip 22 найдено' else NewStaticText1.Caption := 'Имя 7-Zip 22 не найдено';
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
PageFromID(CurPageID) of
       
ISCustomPage1: CompareRegValue('DisplayName');
    end;
end;


Длинные тексты помещайте под спойлер: [MORE]ваш текст[/more]

Dark_Delphin 02-08-2013 17:00 2195301

Всем привет.
Подскажите как суда написать просто свой текст:
Код:

DefaultDirName=Бла-бла-бла

El Dog 02-08-2013 20:49 2195412

saurn спасиба. можно зделать штоб имя 7-Zip 22 найдено было синим имя 7-Zip 22 не найдено было красным?

>>Длинные тексты помещайте под спойлер:
читать дальше »
ваш текст
>> в скрипте помещать?

R.i.m.s.k.y. 03-08-2013 09:17 2195545

Dark_Delphin, эээ в 'апострофы' не получается?
El Dog,
Код:

function CompareRegValue(const Value: String): Boolean;
var
    sResult: String;
begin
    RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip', Value, sResult);
    if (sResult = '7-Zip 22') then begin
      NewStaticText1.Caption := 'Имя 7-Zip 22 найдено'
      NewStaticText1.Font.Color := clBlue;
    end
    else begin
      NewStaticText1.Caption := 'Имя 7-Zip 22 не найдено';
      NewStaticText1.Font.Color := clRed;
    end;
end;


Dark_Delphin 03-08-2013 14:06 2195655

R.i.m.s.k.y., нет. Я пробовал уже.
Тогда в ТЕдите пишет это:
C:\Users\Dark_Delphin\Desktop\Out\'Текст который я напсиал'

Johny777 03-08-2013 14:37 2195672

Dark_Delphin,
Код:

procedure InitializeWizard();
begin
   
WizardForm.DirEdit.Text := 'Текст который я напсиал';
end;

Будь добр прочитать про методы и свойства классов с которыми работаешь! :(

Dark_Delphin 03-08-2013 14:52 2195675

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

Nightwishh 03-08-2013 19:50 2195842

:yahoo: А можно ли вызвать страницу WizardForm.SelectTasksPage, когда в секции [Tasks] пусто?

sergey3695 03-08-2013 22:02 2195912

Nightwishh,
var
CompPage: TWizardPage;

procedure InitializeWizard; -> CompPage := CreateCustomPage(wpSelectDir,'','');

procedure CurPageChanged(CurPageID: Integer); -> if CurPageID = CompPage.Id then

Если страниц нехватает.
Или оставить какую-то фигню в [Tasks] и скрыть TasksList. (то что выше правильнее и лучше)

AlexM22204 05-08-2013 19:09 2196785

Здравствуйте!
Возникла необходимость перепаковать один Inno Setup инсталлятор под себя, вроде всё получилось кроме не знаю как организовать(прописать в скрипте) подхват своих настроек из settings.reg, если таковой имеется в папке с инсталлятором. Если такое где-то было, просьба не ругать а ткнуть носом :cool: Заранее спасибо!!!

делаю так не подхватывается :(

[Run]
Filename: "{win}\regedit.exe"; Parameters: "-s {src}\Settings.reg"; WorkingDir: "{src}"; StatusMsg: "Внесение настроек в реестр...";

Johny777 05-08-2013 23:59 2196943

AlexM22204, Да было уже. Давно. Тут пример через код а не как у тебя через секцию [Run], но разберёшься! :)
http://forum.oszone.net/post-2010676-1173.html

R.i.m.s.k.y. 06-08-2013 12:20 2197137

AlexM22204, WorkingDir: "{win}"

Dark_Delphin 06-08-2013 16:15 2197287

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

Gnom_aka_Lexander 06-08-2013 17:17 2197318

Dark_Delphin, вот так:
читать дальше »
Код:

var
  BtnSet: TNewButton;
  ParametresPage: TWizardPage;
  SetFlag : Boolean; // опорный флаг скрытия ParametresPage

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if PageID = ParametresPage.ID then Result := SetFlag; // встроенная функция сокрытия страниц, открытие ParametresPage привязываем тут к SetFlag
end;

procedure BtnSetClick(Sender: TObject);
begin
  SetFlag := False; // при нажатии на кнопку меняем значение на обратное, чтоб страница ParametresPage была показана
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;

procedure InitializeWizard();
begin
  ParametresPage := CreateCustomPage(wpWelcome, 'Параметры', 'Выберите дополнительные параметры установки'); //страница параметров

  BtnSet := TNewButton.Create(WizardForm);
  with BtnSet do
  begin
    Parent := WizardForm.WelcomePage;
    SetBounds(ScaleX(40), ScaleY(264), ScaleX(75), ScaleY(25));
    Caption := 'Параметры';
    OnClick := @BtnSetClick;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  SetFlag := True; // ParametresPage всегда скрыта
end;


Dark_Delphin 06-08-2013 17:27 2197326

Gnom_aka_Lexander, использую вот скрипт из паблика, сделал вроде всё правильно, но кнопки не вижу.
http://rghost.ru/47933115

Gnom_aka_Lexander 06-08-2013 17:37 2197341

Dark_Delphin, дык. во первых смотрим:
Код:

  BtnSet := TNewButton.Create(WizardForm);
  with BtnSet do
  begin
    Parent := WizardForm.WelcomePage;// у нас OuterNotebook.Hide;, значит кнопки мы не увидим, поэтому начнем с этого:  Parent := WizardForm;
    SetBounds(ScaleX(460), ScaleY(200), ScaleX(175), ScaleY(25));// тут я думаю все понятно?
    Caption := 'Параметры';
    OnClick := @BtnSetClick;
  end;

далее.
поскольку делаем Parent := WizardForm;, то кнопка нужна нам на определенной странице. это значит, в CurPageChanged в самом начале добавляем BtnSet.Hide;
SetFlag := True; // ParametresPage всегда скрыта - тоже лучше в начало вынести.
на нужной странице скорей всего wpWelcome, добавляем BtnSet.Show;
???????
PROFIT!!!

El Sanchez 06-08-2013 17:43 2197346

Цитата:

Цитата AlexM22204
делаю так не подхватывается
[Run]
Filename: "{win}\regedit.exe"; Parameters: "-s {src}\Settings.reg"; WorkingDir: "{src}"; StatusMsg: "Внесение настроек в реестр..."; »

AlexM22204, вероятно {src} раскрывается в путь с пробелами, получается неправильная комстрока для regedit. Нужно так:
Код:

[Run]
Filename: {win}\regedit.exe; Parameters: "-s ""{src}\Settings.reg"""; StatusMsg: "Внесение настроек в реестр..."

Цитата:

Цитата R.i.m.s.k.y.
WorkingDir: "{win}" »

R.i.m.s.k.y., это из другой оперы. Эта директива отвечает за задание процессу текущей директории, т.е. комстроку можно формировать относительно этой директории:
Код:

[Run]
Filename: {win}\regedit.exe; Parameters: -s Settings.reg; WorkingDir: {src}; StatusMsg: "Внесение настроек в реестр..."


insombia 06-08-2013 18:00 2197356

как текстурировать кнопку обзор через ботву? я пробовал но она пропадает
http://rghost.ru/47933940

Gnom_aka_Lexander 06-08-2013 18:08 2197364

insombia, через ботву кнопки не текстурируются. Совсем. обрати внимание на примеры. там везде при создании замены для кнопки, той кнопке, которую нужно "сделать красиво" просто задаются нулевые ширина и высота. А спомощью функции btmSetEven задается действие, которое выполняла та кнопка, которая была заменена на "обрюшеную"
Цитата:

Цитата insombia
я пробовал но она пропадает »

Изучай модуль botva2.iss там описано все полностью. Причем по русски - что вообще здорово.
в твоем случае изучать нужно функцию BtnCreate, самый первый ее параметр.

vint56 06-08-2013 18:11 2197367

insombia твой пример был сделан когда все было скрыто а сейчас надо указать где кнопка будет
with WizardForm.DirBrowseButton do begin
hDirBrowseBtn:=BtnCreate(WizardForm.SelectDirPage.Handle,340,72,80,40,ExpandConstant('{tmp}\button.png'),18,False);
BtnSetEvent(hDirBrowseBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
BtnSetText(hDirBrowseBtn,'>');
BtnSetFont(hDirBrowseBtn,Font.Handle);
BtnSetFontColor(hDirBrowseBtn,$DAE369,$DAE369,$DAE369,$B6B6B6);
Width:=0;
Height:=0;
end;

Dark_Delphin 06-08-2013 18:43 2197387

Gnom_aka_Lexander, к сожелению всеравно не появилась кнопка.

Gnom_aka_Lexander 06-08-2013 18:45 2197388

Dark_Delphin, обрати внимание на строчку SetBounds - первые 2 параметра - расположение - первая координата - расстояние от края слева, вторая - от верха. если сделал все, как я описал, то просто выставив там по 0, должен увидеть кнопку в левом верхнем углу инсталла.

Dark_Delphin 06-08-2013 18:53 2197398

Gnom_aka_Lexander, я не правильно написал, кнопка сама есть, но на странице нету - выбора компонентов...
Вот http://rghost.ru/47935040

Gnom_aka_Lexander 06-08-2013 19:05 2197410

Цитата:

Цитата Dark_Delphin
но на странице компонентов нету... »

дык. ты-ж там ничего не создал, потому и нету ничего. все, что там создаш, нужно аналогично кнопке скрыть в начале CurPageChanged и показать на ParametresPage.ID в той-же CurPageChanged

Dark_Delphin 06-08-2013 19:08 2197413

Gnom_aka_Lexander, а есть пример кода как это сделать?

И еще, только что заметил, что при нажатии также на кнопку Установка - происходит переход на следующую страницу, хотя должна сразу происходить установка...

Gnom_aka_Lexander 06-08-2013 19:21 2197423

Цитата:

Цитата Dark_Delphin
а есть пример кода как это сделать? »

прямо в этом-же скрипте пример и есть

CrackedLabel:=TLabel.Create(WizardForm); // создается лейбел в InitializeWizard
CrackedLabel.Hide; // в CurPageChanged он скрывается
CrackedLabel.Show; // на wpWelcome он показывается

там все элементы созданные, ничего сверхъестественного абсолютно нету.

vint56 06-08-2013 19:22 2197424

Dark_Delphin вот пример
http://rghost.ru/47935847

Dark_Delphin 06-08-2013 19:31 2197427

Спасибо. Вот еще это, подскажите как исправить?

Цитата:

Цитата Dark_Delphin
И еще, только что заметил, что при нажатии также на кнопку Установка - происходит переход на следующую страницу, хотя должна сразу происходить установка... »


Lex_from_Belarus 06-08-2013 21:15 2197496

подскажите пожалуйста, как сделать проверку установленных языков (не язык интерфейса виндовс, а конкретно язык ввода), например, если русский язык то устанавливается один компонента, если дургой язык какой-нибудь, то другой компонент?

Johny777 07-08-2013 00:36 2197609

Lex_from_Belarus,
[Languages]
Name: "en"; MessagesFile: "compiler:Languages\English.isl"
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"

[Components]
Name: "A"; Description: "A Files"; Languages: en;
Name: "B"; Description: "B Files"; Languages: not en; //Languages: ru;

Об этом написано в справке, в "Общие параметры"

Dark_Delphin 07-08-2013 00:50 2197611

Подскажите, пожалуйста, как убрать кнопки свернуть, развернуть, закрыть. (Саму шапку или бордюр убирать не нужно, только кнопки)

saurn 07-08-2013 02:50 2197622

Dark_Delphin, в процедуре InitializeWizard, или любой другой, работающей с формой мастера:
Код:

BorderIcons := [];

insombia 07-08-2013 09:09 2197676

Dark_Delphin как писали выше BorderIcons := []; но если не будет пахать то допиши wizardform.

Dark_Delphin 07-08-2013 15:36 2197966

Спасибо.
Подскажите, пожалуйста, как добавить DirEdit на стекло (ну чтоб без дыр.)?
Я пробовал так:

Код:

iswin7_add_button(WizardForm.DirEdit.Handle);
Но никаких изменений...

Gnom_aka_Lexander 07-08-2013 16:12 2197991

Цитата:

Цитата Dark_Delphin
как добавить DirEdit на стекло (ну чтоб без дыр.)? »

выпросить исходники IsWin7.dll и описать реализацию эдита. ну, или написать ее самому самостоятельно со всеми нужными контролами.
Цитата:

Цитата Dark_Delphin
Но никаких изменений... »

естественно, эдит - не кнопка.

Dark_Delphin 07-08-2013 16:16 2197994

Gnom_aka_Lexander, аа... Там только для кнопок написано.
А как то можно обойти ситуацию?
Я вот думаю под эдит картинку положить.

Gnom_aka_Lexander 07-08-2013 16:17 2197995

Цитата:

Цитата Dark_Delphin
аа... Там только для кнопок написано. »

Цитата:

Цитата Dark_Delphin
iswin7_add_button »

button - кнопка.
Цитата:

Цитата Dark_Delphin
А как то можно обойти ситуацию? »

Цитата:

Цитата Gnom_aka_Lexander
выпросить исходники IsWin7.dll и описать реализацию эдита. ну, или написать ее самому самостоятельно со всеми нужными контролами. »


Dark_Delphin 07-08-2013 18:14 2198068

Как поле сделать пустым?
DefaultDirName={pf}

saurn 08-08-2013 03:35 2198257

Цитата:

Цитата Dark_Delphin
Как поле сделать пустым?
DefaultDirName={pf} »

Код:

procedure InitializeWizard();
begin
    WizardForm.DirEdit.Text := #0;
end;


insombia 08-08-2013 17:28 2198542

есть ещё какие-то примеры для закрепления ярлыка в панели задач Windows 7? а то с PinToTasckbar.vbs не понятно как-то

Nightwishh 10-08-2013 22:09 2199629

Когдато давно видел пример, как убрать кнопку "Развернуть" именно в скине, выкладывал его Johny777 в архиве (если я не ошибаюсь), но теперь не могу найти. Может кто помнит хотябы в какой части этого форума находиться этот пример.

insombia 10-08-2013 23:26 2199669

Q: Можно ли сделать две кнопки свернуть и закрыть у окна?
http://krinkels.org/attachment.php?a...0&d=1360410162

Fakt_37 11-08-2013 21:07 2200039

здравствуйте, подскажите пожалуйста какой ключ нужен чтобы файлы распоковались в папку windows?

insombia 11-08-2013 21:16 2200041

Fakt_37
http://forum.ru-board.com/topic.cgi?...limit=1&m=16#1

Nightwishh 11-08-2013 22:42 2200068

:yahoo: Как можно сделать список выбора компонентов без WizardFormComponentsList, т.е. создать новые чекбоксы и к ним прикрутить тот или иной компонент? Где можно найти такой пример. И будет ли это работать в ISDone? Спасибо!

saurn 11-08-2013 23:45 2200088

Nightwishh, в расширенной версии Inno, в папке коробочных примеров(Examples) есть скрипт Example_NewCheckListBox - это, как раз то, что вас интересует.
---------------------------------------------------------------------------------------------------------------
Цитата:

Цитата Fakt_37
здравствуйте, подскажите пожалуйста какой ключ нужен чтобы файлы распоковались в папку windows? »

Это не ключ, а переменная пути)
Код:

Source: my_files\*; DestDir: {win}; Flags: uninsneveruninstall

nik1967 12-08-2013 00:37 2200097

Nightwishh, посмотри.

icq99999999 12-08-2013 15:26 2200334

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

Johny777 12-08-2013 18:49 2200430

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

[Files]
Source: "file1.exe"; Flags: dontcopy nocompression
Source: "file2.exe"; Flags: dontcopy nocompression

[code      ]


const
   
RUN_PARAM = '-run';

function InitializeSetup(): Boolean;
var
   
ResultCode: Integer;
begin
    if
Pos(RUN_PARAM, GetCmdTail) <> 0 then
    begin
       
ExtractTemporaryFile('file1.exe');
        Exec(AddBackslash(ExpandConstant('{tmp}')) + 'file1.exe', '', ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, ResultCode);
        Result := True;
    end else
    begin
       
ExtractTemporaryFile('file2.exe');
        Exec(AddBackslash(ExpandConstant('{tmp}')) + 'file2.exe', '', ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, ResultCode);
    end;
end;



пример запуска: "setup.exe -run"
------------------------------------------------------
при запуске с этим параметром:
1. извлекаем file1.exe в папку в темпе
2. запускаем его оттуда без ожидания завершения его процесса
3. возвращаем из InitializeSetup() True следствием чего будет инициализация приложения установки

при запуске без параметра:
1. извлекаем file2.exe в папку в темпе
2. запускаем его оттуда без ожидания завершения его процесса
3. возвращаем из InitializeSetup() False

icq99999999 12-08-2013 21:40 2200505

Цитата Johny777:
Код: »
а если нужно сделать следующее:
c запуска ключом:
распаковать всё в %temp%\spacep
скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\
запустить файл с параметром %temp%\spacep\1\hidcon.exe -setup.cmd
запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat
после завершения hidcon.exe удалить все извлечённые файлы
при обычном запуске:
распаковать всё в %temp%\spacep
скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\
запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat
после завершения hidcon.exe удалить папку %temp%\spacep\1
запустить %temp%\spacep\set.exe
после завершения процесса set.exe скопировать %temp%\spacep\comp.ini и положить рядом с программой
удалить все извлечённые файлы.
весь процесс должен быть полностью скрыт от глаз пользователя

Nightwishh 12-08-2013 21:49 2200509

saurn, И это снова я. В срипте Example_NewCheckListBox радиобуттоны и чекбоксы находятся на компонентслисте, а мне хотелось бы чтобы они были свободными, как в скрипте Прототип (только там задачи), т.к. я на них хочу повесить OneClick (звук wav).

Johny777 13-08-2013 03:19 2200607

Nightwishh,
Цитата:

Цитата Nightwishh
т.к. я на них хочу повесить OneClick (звук wav). »

а в чём проблема? так не пойдёт?
читать дальше »
Код:

procedure ComponentsListOnClickCheck(Sender: TObject);
begin
   
// проигрывание звука
end;


procedure InitializeWizard();
begin
   
WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;
end;



=================================================================================
icq99999999,
Цитата:

Цитата icq99999999
распаковать всё »

а всё это сколько?
нет такой возможности извлечь папку из инсталла не во время установки. Только если извлекать по одному файлу, как в последнем примере.
Не знаю сколько файлов лежит в папке spacep, поэтому сделал так: пакуешь папку в 7z архив и кладёшь рядом с экзешником инсталла
читать дальше »
Код:

[Files]
Source: "7-zip32.dll"; Flags: dontcopy nocompression


[code    ]
#define A = (Defined UNICODE) ? "W" : "A"
#define Use_Debug

const
   
SPACE_CHAR = #32;
    SZ_OK = 0;
    RUN_PARAM = '-run';
    ARCHIVE_NAME = 'spacep.7z';
    INI_NAME = 'comp.ini';
   

function SevenZip(const _hwnd: HWND; _szCmdLine: PAnsiChar; _szOutput: PAnsiChar; const _dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';


function SimpleExtractSevenZip(const ArchivePath, DestPath: AnsiString): Boolean;
var
   
SevenZipCmd: AnsiString;
begin
   
SevenZipCmd := Format( 'x "%s" "%s" -y -hide', [ ArchivePath, AddBackslash(RemoveBackslash(DestPath)) ] );
    CharToOemBuff(SevenZipCmd);
    Result := SevenZip(0, SevenZipCmd, '', 0) = SZ_OK;
end;


function InitializeSetup(): Boolean;
var
   
ResultCode: Integer;
    TempPath, OuterPath: String;
begin
   
Result := False;

    OuterPath := AddBackslash( ExpandConstant('{src}') );
    TempPath := AddBackslash( ExpandConstant('{tmp}') );

    if Pos(RUN_PARAM, GetCmdTail) <> 0 then // c запуска ключом:
   
begin
       
#ifdef Use_Debug
           
MsgBox('распаковать всё в %temp%\spacep', mbInformation, MB_OK);
        #endif
       
if not SimpleExtractSevenZip(OuterPath + ARCHIVE_NAME, TempPath) then MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
       
        #ifdef Use_Debug
           
MsgBox('скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\', mbInformation, MB_OK);
        #endif
       
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);

        #ifdef Use_Debug
           
MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -setup.cmd', mbInformation, MB_OK);
        #endif
       
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-setup.cmd', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
       
        #ifdef Use_Debug
           
MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat', mbInformation, MB_OK);
        #endif
       
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
       
        #ifdef Use_Debug
           
MsgBox('...папка в темпе удалится сама', mbInformation, MB_OK);
        #endif
   
end else // при обычном запуске:
   
begin
       
#ifdef Use_Debug
           
MsgBox('распаковать всё в %temp%\spacep', mbInformation, MB_OK);
        #endif
       
if not SimpleExtractSevenZip(OuterPath + ARCHIVE_NAME, TempPath) then MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
       
        #ifdef Use_Debug
           
MsgBox('скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\', mbInformation, MB_OK);
        #endif
       
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
       
        #ifdef Use_Debug
           
MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat', mbInformation, MB_OK);
        #endif
       
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
       
        #ifdef Use_Debug
           
MsgBox('после завершения hidcon.exe удалить папку %temp%\spacep\1', mbInformation, MB_OK);
        #endif
       
DelTree(TempPath + 'spacep\1\', True, True, True);
       
        #ifdef Use_Debug
           
MsgBox('запустить %temp%\spacep\set.exe', mbInformation, MB_OK);
        #endif
       
Exec(TempPath + 'spacep\' + 'set.exe', '-1бат.bat', TempPath + 'spacep\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
       
        #ifdef Use_Debug
           
MsgBox('после завершения процесса set.exe скопировать %temp%\spacep\comp.ini и положить рядом с программой', mbInformation, MB_OK);
            MsgBox('а что, если инсталл на диске?', mbError, MB_OK);
        #endif
       
CopyFile(TempPath + 'spacep\' + INI_NAME, OuterPath + INI_NAME, False);
       
        #ifdef Use_Debug
           
MsgBox('...папка в темпе удалится сама', mbInformation, MB_OK);
        #endif
   
end;
end;



Исходник с файлами:

icq99999999 13-08-2013 09:11 2200651

Цитата Johny777:
а всё это сколько? »
под всё я имел ввиду содержимое инстала, а поэтому использовать стороннюю утилиту 7z не нужно, вот только как 7z отключить?
след вопрос:
а можно ли после копирования проверить есть ли файл comp.ini рядом с прогой, если файла нет то копировать его из %temp%\spacep\ в C:\AppData\
а потом скопировать файл "comp.ini" из директории с прогой в %temp%\spacep\ если файла нет то копировать его из C:\AppData\ в %temp%\spacep\
можно ли убрать появляющейся(при запуске) на понели задач окошко в котором написано установка
можно ли отключить при компиляции изображение WizModernImage.bmp
можно ли чтобы при запуске с ключом файл находящейся внутри инстала распаковывался в %windir%\temp\ а при обычном запуске не распаковывался

Nightwishh 13-08-2013 18:58 2200925

Блин, я сам всех и себя запутал. Вообщем есть скрипт Button Sound
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
LicenseFile=compiler:License.txt

[Files]
Source: UI\buttonclick.WAV; Flags: dontcopy
Source: UI\buttonclickrelease.WAV; Flags: dontcopy
Source: UI\buttonrollover.WAV; Flags: dontcopy

[ Code]
function sndPlaySound(lpszSoundName: AnsiString; uFlags: cardinal): Integer; external 'sndPlaySoundA@winmm stdcall delayload'; /// функция проигрывания звука

procedure PlaySoundOnEnter(Sender: TObject); /// процедура при наведении
begin
  sndPlaySound(ExpandConstant('{tmp}\buttonrollover.WAV'),$0001);
end;

procedure PlaySoundOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);  /// при нажатии кнопки
begin
  sndPlaySound(ExpandConstant('{tmp}\buttonclick.WAV'),$0001);
end;

procedure PlaySoundOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);  /// при отпускании кнопки
begin
  sndPlaySound(ExpandConstant('{tmp}\buttonclickrelease.WAV'),$0001);
end;

procedure InitializeWizard;
begin
  ExtractTemporaryFile('buttonclick.WAV'); /// функцией ExtractTemporaryFile извлекаем файл во временную папку - при нажатии кнопри паши по контролу (не путать с кликом)
  ExtractTemporaryFile('buttonclickrelease.WAV'); /// при отпускании кнопки мыши с контрола
  ExtractTemporaryFile('buttonrollover.WAV');  /// при наведении

  with WizardForm do
  begin
    with NextButton do
    begin
      OnMouseEnter := @PlaySoundOnEnter;
      OnMouseDown := @PlaySoundOnMouseDown;
      OnMouseUp := @PlaySoundOnMouseUp;
    end;

    with BackButton do
    begin
      OnMouseEnter := NextButton.OnMouseEnter;
      OnMouseDown := NextButton.OnMouseDown;
      OnMouseUp := NextButton.OnMouseUp;
    end;

    with CancelButton do
    begin
      OnMouseEnter := NextButton.OnMouseEnter;
      OnMouseDown := NextButton.OnMouseDown;
      OnMouseUp := NextButton.OnMouseUp;
    end;

    with DirBrowseButton do
    begin
      OnMouseEnter := NextButton.OnMouseEnter;
      OnMouseDown := NextButton.OnMouseDown;
      OnMouseUp := NextButton.OnMouseUp;
    end;

    with GroupBrowseButton do
    begin
      OnMouseEnter := NextButton.OnMouseEnter;
      OnMouseDown := NextButton.OnMouseDown;
      OnMouseUp := NextButton.OnMouseUp;
    end;
  end;
end;

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

insombia 13-08-2013 19:59 2200965

Nightwishh через bass вроде можно,но не знаб работает ли без ботвы,так как там есть пример тот что тебе нужен

Johny777 13-08-2013 20:43 2200990

Вложений: 1
icq99999999,
Цитата:

Цитата icq99999999
вот только как 7z отключить? »

да не быть мне кэпом! переписать код конечно :)
Цитата:

Цитата icq99999999
под всё я имел ввиду содержимое инстала »

переписал, изучай:

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


[Setup]
AppName=Demo
AppVerName=1.1
OutputDir=Output
CreateAppDir=no


[Files]
Source: spacep\*; DestDir:{tmp}\spacep; Flags: recursesubdirs createallsubdirs


[code  ]
#define A = (Defined UNICODE) ? "W" : "A"
#define Use_Debug

const
   
RUN_PARAM = '-run';
    INI_NAME = 'comp.ini';
   
    GCL_STYLE = -26;
    CS_NOCLOSE = $200;
    WM_LBUTTONDOWN = $0201;
    WM_LBUTTONUP = $0202;


function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@User32.dll stdcall';
function SetClassLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): DWORD; external 'SetClassLong{#A}@User32.dll stdcall';
function GetClassLong(hWnd: HWND; nIndex: Integer): DWORD; external 'GetClassLong{#A}@User32.dll stdcall';



function RunWithParam(): Boolean;
begin
   
Result := Pos(RUN_PARAM, GetCmdTail) <> 0;
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
   
ResultCode: Integer;
    TempPath, OuterPath: String;
begin
    if
CurStep = ssPostInstall then
    begin
       
OuterPath := AddBackslash( ExpandConstant('{src}') );
        TempPath := AddBackslash( ExpandConstant('{tmp}') );

        if RunWithParam() then // c запуска ключом:
       
begin
           
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
            Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-setup.cmd', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        end else // при обычном запуске:
       
begin
           
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
            Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            DelTree(TempPath + 'spacep\1\', True, True, True);
            Exec(TempPath + 'spacep\' + 'set.exe', '-1бат.bat', TempPath + 'spacep\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            if not CopyFile(TempPath + 'spacep\' + INI_NAME, OuterPath + INI_NAME, False) then
            begin
               
CopyFile(TempPath + 'spacep\' + INI_NAME, ExtractFilePath(ExpandConstant('{localappdata}')) + INI_NAME, False);
                if not CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False) then
               
CopyFile(ExtractFilePath(ExpandConstant('{localappdata}')) + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
            end;
        end;
    end;
end;


procedure InitializeWizard();
begin
   
ShowWindow(Application.Handle, SW_HIDE); // прячем кнопку в панели задач
   
SetClassLong(WizardForm.Handle, GCL_STYLE, GetClassLong(WizardForm.Handle, GCL_STYLE) or CS_NOCLOSE); // без Alt+F4
    // прячем форму
   
WizardForm.BorderStyle := bsNone;
    WizardForm.SetBounds(Screen.Width-777, Screen.Height-777, 0, 0);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
    if
CurPageID = wpReady then
    begin
       
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
        PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
    end;
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageID of
       
wpWelcome, wpSelectDir, wpFinished {, другие твои страницы}: Result := True;
    end;
end;


Цитата:

Цитата icq99999999
а можно ли после копирования проверить есть ли файл comp.ini рядом с прогой, если файла нет то копировать его из %temp%\spacep\ в C:\AppData\
а потом скопировать файл "comp.ini" из директории с прогой в %temp%\spacep\ если файла нет то копировать его из C:\AppData\ в %temp%\spacep\
можно ли убрать появляющейся(при запуске) на понели задач окошко в котором написано установка »

это всё в коде выше, вот только я не уверен насчёт C:\AppData\. Может имелось в виду то что тебе выдаёт месседжбокс в коде выше, в первой строке процедуры InitializeWizard();
Цитата:

Цитата icq99999999
проверить есть ли файл comp.ini рядом с прогой »

проверяется функцией FileExists, но ясделал проще. Просто если CopyFile вернёт False делаем что надо
Цитата:

Цитата icq99999999
можно ли отключить при компиляции изображение WizModernImage.bmp »

Я не совсем понимаю что ты имеешь в виду. Нельзя управлять теневым исходным кодом инно отсюда. Чтоб этой картинки не было в принципе, нужно переписать исходники инно.
Можно спрятать: впиши в InitializeWizard это WizardForm.WizardBitmapImage.Hide;
Можно пропустить страницу приветствия: [Setup] DisableWelcomePage=yes
Цитата:

Цитата icq99999999
можно ли чтобы при запуске с ключом файл находящейся внутри инстала распаковывался в %windir%\temp\ а при обычном запуске не распаковывался »

Можно:
1. если файл должен попасть в темп во время установки то так:
[Files]
Source: имя_файла; DestDir:{tmp}\; Check: RunWithParam();
2. если где-то ещё то как в примере отсюда http://forum.oszone.net/post-2200430-1002.html с соответствующей проверкой
if RunWithParam() then ExtractTemporaryFile('имя_файла')

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

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

[Setup]
...
RawDataResource=SndA:bugreporter_succeeded.wav |SndB:buttonclickreleaseo.WAV


[code  ]
#define A = (Defined UNICODE) ? "W" : "A"

type
   
HINST = THandle;
    HMODULE = HINST;
    Pointer = Longint;
    HRSRC = THandle;
    HGLOBAL = THandle;

const
   
SND_ASYNC          = $0001;
    SND_NODEFAULT      = $0002;
    SND_MEMORY          = $0004;
    RT_RCDATA          = 10;


function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall';
function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external 'LoadResource@kernel32.dll stdcall';
function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall';
function LockResource(hResData: HGLOBAL): Pointer; external 'LockResource@kernel32.dll stdcall';



var
   
hResourceSound: HRSRC;
    pSoundMemory: Pointer;

procedure InitializeWizard();
begin
   
hResourceSound := FindResource(HInstance, '_IS_SNDA', RT_RCDATA);
    pSoundMemory := LockResource(LoadResource(HInstance, hResourceSound));
    sndPlaySound(pSoundMemory, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end;



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

Nightwishh
Цитата:

Цитата Nightwishh
Как мне сделать звук при наведении и при нажатии у компонентов, без ботвы? »

накатал пример при наведении и нажатии, пойдёт?
читать дальше »
Код:

[Setup]
...
RawDataResource=SndA:bugreporter_succeeded.wav |SndB:buttonclickreleaseo.WAV


[Components]
Name: "main"; Description: "Main Files";
Name: "main\a"; Description: "A Files";
Name: "main\b"; Description: "B Files";


[code  ]
#define A = (Defined UNICODE) ? "W" : "A"

type
   
HINST = THandle;
    HMODULE = HINST;
    Pointer = Longint;
    HRSRC = THandle;
    HGLOBAL = THandle;

const
   
SND_ASYNC          = $0001;
    SND_NODEFAULT      = $0002;
    SND_MEMORY          = $0004;
    RT_RCDATA          = 10;


function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall';
function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external 'LoadResource@kernel32.dll stdcall';
function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall';
function LockResource(hResData: HGLOBAL): Pointer; external 'LockResource@kernel32.dll stdcall';

var
   
pSoundMemory_A, pSoundMemory_B: Pointer;
   
function GetResourceSoundAddr(const ResourceName: String): Pointer;
var
   
hResourceSound: HRSRC;
begin
   
hResourceSound := FindResource(HInstance, ResourceName, RT_RCDATA);
    Result := LockResource(LoadResource(HInstance, hResourceSound));
end;

procedure ComponentsOnClickCheck(Sender: TObject);
begin
   
sndPlaySound(pSoundMemory_B, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end;

var
   
LastIndex: Integer;

procedure ComponentsItemsMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
    if
Index = -1 then
    begin
       
LastIndex := -1;
        Exit;
    end;
       
    if LastIndex = -1 then
    begin
       
LastIndex := Index;
        sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
    end else
    if
LastIndex = Index then Exit else
    if
LastIndex <> Index then
    begin
       
LastIndex := Index;
        sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
    end;
end;


procedure InitializeWizard();
begin
   
LastIndex := -1;

    pSoundMemory_A := GetResourceSoundAddr('_IS_SNDA');
    pSoundMemory_B := GetResourceSoundAddr('_IS_SNDB');
   
    WizardForm.ComponentsList.OnItemMouseMove := @ComponentsItemsMouseMove;
    WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClickCheck;
end;




исходники простого воспроизведения и звука на компонентах:

tr011_tmn 14-08-2013 11:19 2201266

приветствую коллеги.

Хочу обратится за помощью. Можно ли реализовать удаление содержимого каталога, в каталоге {app} без бантика?

Например в каталоге {app}\Redist удалить все что находится в каталоге Redist не трогая содержимое {App}?

В идеале хотелось бы реализовать через Checkbox, типа "хотите ли вы очистить содержимое каталога Redist" и при отмеченном checkbox что бы происходила очистка.

Johny777 14-08-2013 15:02 2201455

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

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

const
   
FOLDER_NAME = 'Redist';

var
   
DeleteRedistCheckBox: TCheckBox;

// Force - Boolean value that is true if folders with the read-only attribute set are to be deleted; false (default) if they are not.
procedure DeleteFolder(const FolderPath: String; const Force: Boolean);
var
   
oFS: Variant;
begin
    if not
DirExists(FolderPath) then Exit;
    oFS := CreateOleObject('Scripting.FileSystemObject');
    try
       
oFS.DeleteFolder(RemoveBackslash(FolderPath), Force);
    except
       
ShowExceptionMessage();
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    if
CurStep = ssPostInstall then
      if
DeleteRedistCheckBox.Checked then DeleteFolder(AddBackslash(ExpandConstant('{app}')) + FOLDER_NAME, True);
      // или DelTree(AddBackslash(ExpandConstant('{app}')) + FOLDER_NAME, True, True, True);
end;


procedure InitializeWizard();
begin
   
DeleteRedistCheckBox := TCheckBox.Create(WizardForm.InstallingPage);
    with DeleteRedistCheckBox do
    begin
       
Parent := WizardForm.InstallingPage;
        SetBounds(ScaleX(100), ScaleY(100), ScaleX(100), ScaleY(16));
        Caption := 'Delete Redist Folder';
    end;
end;


vint56 14-08-2013 15:37 2201485

Johny777 у тебя случаем нет примера Переименование файлов не по маске а по определенному названию vo_ russian.spk на vo_english.spk в зависимости от выбранного компонента

tr011_tmn 14-08-2013 15:56 2201505

Цитата:

Цитата Johny777
tr011_tmn, удаление самого каталога вместе с содержимым подойдёт? »

глянул, если верно понял то {app} не будет трогаться при удалении FOLDER_NAME = 'Redist';. Все верно?

Johny777 14-08-2013 17:18 2201553

vint56,
Цитата:

Цитата vint56
у тебя случаем нет примера Переименование файлов не по маске а по определенному названию vo_ russian.spk на vo_english.spk в зависимости от выбранного компонента »

Не было пока ты не спросил :) вот тебе процедура
читать дальше »
Код:

[Components]
Name: en; Description: Russian to English; Flags: exclusive
Name: ru; Description: English to Russian; Flags: exclusive

;[Files]
;Source: Folder\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs onlyifdoesntexist


[code    ]
#define A = (Defined UNICODE) ? "W" : "A"

function MoveFile(lpExistingFileName, lpNewFileName: String): BOOL; external 'MoveFile{#A}@kernel32.dll stdcall';

procedure RenameFileChunks(const RootFolder, SourceFileChunk, DestFileChunk: String; const Recurse: Boolean);
var
   
NewSearchPath, TempFileName: String;
    FindRec: TFindRec;
begin
   
NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));

    if FindFirst(NewSearchPath + '*.*', FindRec) then
    try
        repeat
       
            if
FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
            begin

                if
Pos(SourceFileChunk, FindRec.Name) <> 0 then
                begin
                   
TempFileName := FindRec.Name;
                    StringChange(TempFileName, SourceFileChunk, DestFileChunk);
                    MoveFile(NewSearchPath + FindRec.Name, NewSearchPath + TempFileName);
                end;
            end else
            if
(FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then
              if
Recurse then RenameFileChunks(NewSearchPath + FindRec.Name, SourceFileChunk, DestFileChunk, Recurse);
                 
        until not FindNext(FindRec);
    finally
       
FindClose(FindRec);
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
   
AppPath: String;
begin
    if
CurStep = ssPostInstall then
    begin
       
AppPath := ExpandConstant('{app}');
        MsgBox('Сейчас переименую', mbInformation, MB_OK);
        if IsComponentSelected('ru') then
         
RenameFileChunks(AppPath, 'english', 'russian', True)
       
        if
IsComponentSelected('en') then
         
RenameFileChunks(AppPath, 'russian', 'english', True);
    end;
end;


прототип: procedure RenameFileChunks(const RootFolder, SourceFileChunk, DestFileChunk: String; const Recurse: Boolean);

где:
RootFolder - исходная папка с файлами и папками, где нужно переименовывать
SourceFileChunk - часть в имени файла которую нужно переименовать, в данном случае 'russian' в vo_ russian.spk
DestFileChunk - часть в имени файла в которую нужно переименовать - 'english'
Recurse - булев значение. Если True то будет искать в подкаталогах RootFolder-а, в противном случае только в RootFolder

вызываешь процедуру например на этапе ssPostInstall для соответсвующих компонентов, если они выбраны ( IsComponentSelected(...) ... )

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

tr011_tmn,
Цитата:

Цитата tr011_tmn
Все верно? »

верно, слетит только папка Redist с её содержимым

vint56 14-08-2013 17:48 2201570

Johny777 а что {app} константа не работает
procedure InitializeWizard;
begin
RenameFileChunks('C:\Program Files (x86)\ISDone', 'english', 'russian', True); только если так
end;

volga163@vk 14-08-2013 18:30 2201599

Здравствуйте. Возможно ли сделать такую фишку:

Если существует файл config.ini в папке, куда ставится программа, но нет определённой ветки в реестре, установщик заменяет файл config.ini и создаёт ветку с определённым значением и наоборот.
Если существует и то, и то, то установка ничего из них не трогает.
Если нет ни того, ни того, то установка создаёт и ветку, и файл.

Голову сломал, ничего на ум не приходит.

Johny777 14-08-2013 18:43 2201605

vint56,
Цитата:

Цитата vint56
а что {app} константа не работает »

она работает и всё остальное кроме встроенной RenameFile, которая по непонятным мне причинам в данном случае НЕ работает (моё доверие к встроенным функциям упало ещё на одно деление :( )

заместо её используй WinApi функцию MoveFile, которой можно переименовывать файлы

обновил предыдущий код
всё понятное дело перед этим проверил у себя на безошибочную работу



volga163@vk, создать ветку в реестре? что-то я не пойму. Может ключ. И где? в каком разделе? Какие значения туда внести? Как ключ называется? Подробнее насчёт реестра скажи
а лучше всего выложи содержание .reg файла

vint56 14-08-2013 19:00 2201617

Johny777 Большое спасибо

Shkutu 14-08-2013 19:16 2201626

Здравствуйте!
В моем скрипте создаются и используются кастомные формочки. Сам инсталляор должен быть двуязычным (рус + англ). Текст на стандартных формах при выборе определенного языка на этот язык переводится, а текст на кастомных формах - очевидно, нет. Может, кто подскажет, как корректно реализовать двуязычность для кастомных форм? Это в скрипте создания форм надо мониторить язык как-то и в зависимости от языка выводить разные сообщения? Или это нужно как-то править языковые (.isl) файлы?
В работе с inno новичок, буду благодарна за помощь:)

volga163@vk 14-08-2013 19:33 2201636

Цитата:

Цитата Johny777
Подробнее насчёт реестра скажи »

Проверяем наличие этой ветки: HKCU\Control Panel\MyApp\Test\, значение типа expandsz, с текстом "ID" и именем ID. Вот как на картинке:


nik1967 14-08-2013 20:08 2201649

Shkutu, для этого в Inno есть секция [CustomMessages].
Если я правильно понял
Код:

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

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

[CustomMessages]
rus.interface=Интерфейс
rus.choice=Выберите компоненты, которые вы хотите установить.

eng.interface=Interface
eng.choice=Select components which you want to set.

[_Code]
var
  Page: TWizardPage;

procedure InitializeWizard;
begin
  Page:=CreateCustomPage(wpWelcome, ExpandConstant('{cm:interface}'), ExpandConstant('{cm:choice}'));
end;



Наткнулся на скрипт, который писал неизвестно когда и неизвестно кому :). Может пригодится кому.
MyCoustomExit
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputDir=.

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

[CustomMessages]
rus.ExitSetupTitle1=Вы уверены, что хотите выйти из программы установки?
eng.ExitSetupTitle1=Quit the setup program?

[_code]
const
  ID_QUESTION = 65579;

var
  MyCoustomExit: TPanel;
  YesButton,NoButton: TButton;
  IsExit: boolean;
  PageNameLabel2,PageDescriptionLabel2: TNewStaticText;
  MyExitLabel: TLabel;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= false;
end;

procedure MyCoustomCancelClick(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:= IsExit;
  MyCoustomExit.Show;
  NoButton.Show;
  YesButton.Show;
  WizardForm.Bevel.Parent:= MyCoustomExit;
  WizardForm.Bevel1.Parent:= MyCoustomExit;
end;

procedure NoButtonClick(Sender: TObject);
begin
  IsExit:= false;
  MyCoustomExit.Hide;
  NoButton.Hide;
  YesButton.Hide;
  WizardForm.Bevel.Parent:= WizardForm;
  WizardForm.Bevel1.Parent:= WizardForm.InnerPage;
end;

procedure YesButtonClick(Sender: TObject);
begin
  IsExit:= True;
  WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end;

procedure InitializeWizard();                     
begin
  MyCoustomExit:= TPanel.Create(WizardForm);
  with MyCoustomExit do begin
    Parent:= WizardForm;
    SetBounds(ScaleX(0),ScaleY(0),WizardForm.Width,WizardForm.Height);

    with TNewIconImage.Create(WizardForm) do begin
      Parent:= MyCoustomExit;
      Left:= ScaleX(230);
      Top:= ScaleY(85);
      Icon.Handle := ID_QUESTION;
    end;

    PageNameLabel2:= TNewStaticText.Create(MyCoustomExit);
    with PageNameLabel2 do begin
      Parent:= MyCoustomExit;
      SetBounds(WizardForm.PageNameLabel.Left,WizardForm.PageNameLabel.Top,WizardForm.PageNameLabel.Width,WizardForm.PageNameLabel.Height);
      Font.Style:= [fsBold];
      Caption:= SetupMessage(msgExitSetupTitle);     
    end;

    PageDescriptionLabel2:= TNewStaticText.Create(MyCoustomExit);
    with PageDescriptionLabel2 do begin
      Parent:= MyCoustomExit;
      SetBounds(WizardForm.PageDescriptionLabel.Left,WizardForm.PageDescriptionLabel.Top,WizardForm.PageDescriptionLabel.Width,WizardForm.PageDescriptionLabel.Height);
      Caption:= CustomMessage('ExitSetupTitle1');
    end;

    MyExitLabel:= TLabel.Create(MyCoustomExit);
    with MyExitLabel do begin
      Parent:= MyCoustomExit;
      SetBounds(ScaleX(0),ScaleY(150),WizardForm.Width,ScaleY(80));
      AutoSize:= False;
      WordWrap:= True;
      Alignment:= taCenter;
      Caption:= SetupMessage(msgExitSetupMessage);     
    end;

    NoButton:= TButton.Create(MyCoustomExit);
    with NoButton do begin
      Parent:= WizardForm;
      SetBounds(WizardForm.CancelButton.Left,WizardForm.CancelButton.Top,WizardForm.CancelButton.Width,WizardForm.CancelButton.Height);
      Caption:= SetupMessage(msgButtonNo);
      OnClick:= @NoButtonClick;
    end;

    YesButton:= TButton.Create(MyCoustomExit);
    with YesButton do begin
      Parent:= WizardForm;
      SetBounds(WizardForm.NextButton.Left,WizardForm.NextButton.Top,WizardForm.NextButton.Width,WizardForm.NextButton.Height);
      Caption:= SetupMessage(msgButtonYes);
      OnClick:= @YesButtonClick;
    end;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
begin
  MyCoustomExit.Hide;
  NoButton.Hide;
  YesButton.Hide;
  WizardForm.OnCloseQuery:=@MyCoustomCancelClick;
end;

Единственное "но" - при стандартной распаковке при нажатии на "Отмена" не останавливается распаковка.

Johny777 15-08-2013 00:29 2201802

volga163@vk, сделал
читать дальше »
Код:

[Files]
Source: config.ini; DestDir:{app}; Check: INI_InDestFolder();


[code  ]
#define A = (Defined UNICODE) ? "W" : "A"

const
   
TEST_REG_SUB_KEY = 'Control Panel\My App\Test';
    TEST_INI_FILE_NAME = 'config.ini';
    TEST_REG_VALUE_NAME = 'ID';
    TEST_REG_VALUE = 'ID';

///////////////////////////////////////

const
   
ERROR_SUCCESS          = 0;

    STANDARD_RIGHTS_ALL    = $001F0000;
    KEY_QUERY_VALUE        = $0001;
    KEY_SET_VALUE          = $0002;
    KEY_CREATE_SUB_KEY    = $0004;
    KEY_ENUMERATE_SUB_KEYS = $0008;
    KEY_NOTIFY            = $0010;
    KEY_CREATE_LINK        = $0020;
    SYNCHRONIZE            = $00100000;

    KEY_ALL_ACCESS = (STANDARD_RIGHTS_ALL or KEY_QUERY_VALUE or KEY_SET_VALUE or KEY_CREATE_SUB_KEY or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY or KEY_CREATE_LINK) and not SYNCHRONIZE;

    READ_CONTROL          = $00020000;
    STANDARD_RIGHTS_READ  = READ_CONTROL;

    KEY_READ = (STANDARD_RIGHTS_READ or KEY_QUERY_VALUE or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY) and not SYNCHRONIZE;

    REG_EXPAND_SZ          = 2;

    SINGLE_CHAR_SIZE      = 2;


type
   
ACCESS_MASK = DWORD;
    REGSAM = ACCESS_MASK;
    HKEY = LongWord;
    Pointer = Longint;
    PByte = Pointer;
    PDWORD = Pointer;


function RegCreateKeyEx(hKey: HKEY; lpSubKey: String; Reserved: DWORD; lpClass: String; dwOptions: DWORD; samDesired: REGSAM; lpSecurityAttributes: Longint;
  var phkResult: HKEY; var lpdwDisposition: DWORD): Longint; external 'RegCreateKeyEx{#A}@advapi32.dll stdcall';
function RegSetValueEx(hKey: HKEY; lpValueName: String; Reserved: DWORD; dwType: DWORD; lpData: Pointer; cbData: DWORD): Longint; external 'RegSetValueEx{#A}@advapi32.dll stdcall';
function RegCloseKey(hKey: HKEY): Longint; external 'RegCloseKey@advapi32.dll stdcall';
function RegOpenKeyEx(hKey: HKEY; lpSubKey: String; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; external 'RegOpenKeyEx{#A}@advapi32.dll stdcall';
function RegQueryValueEx(hKey: HKEY; lpValueName: String; lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD): Longint; external 'RegQueryValueEx{#A}@advapi32.dll stdcall';


function CreateRegKey(const hKey: HKEY; const lpSubKey: String; out phkResult: HKEY): Boolean;  // phkResult - хэндл открытого ключа. Нам он пригодится
var
   
lpdwDisposition: DWORD;
begin
   
Result := RegCreateKeyEx(hKey, lpSubKey, 0, '', 0, KEY_ALL_ACCESS, 0, phkResult, lpdwDisposition) = ERROR_SUCCESS;
end;


function hSetRegExpandStringValue(const hKeyOpened: HKEY; const ValueName, Value: String): Boolean; // сюда в hKeyOpened отправляем открытый хэндл, чтоб не открывать новый
begin
   
Result := RegSetValueEx(hKeyOpened, ValueName, 0, REG_EXPAND_SZ, CastStringToInteger(Value), (Length(Value) + 1) * SINGLE_CHAR_SIZE) = ERROR_SUCCESS;
end;


function WinApi_RegKeyExists(const hKey: HKEY; const lpSubKey: String): Boolean;
var
   
phkResult: HKEY;
begin
   
Result := RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS;
    if Result then RegCloseKey(phkResult);
end;


function WinApi_RegKeyValueExists(const hKey: HKEY; const lpSubKey, lpValueName: String): Boolean;
var
   
phkResult: HKEY;
begin
    if
RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS then
    try
       
Result := RegQueryValueEx(phkResult, lpValueName, 0, 0, 0, 0) = ERROR_SUCCESS;
    finally
       
RegCloseKey(phkResult);
    end;
end;


function INI_InDestFolder(): Boolean;
var
   
hKeyOpened: DWORD;
begin
   
Result := not FileExists(  AddBackslash( ExpandConstant('{app}') ) + TEST_INI_FILE_NAME  );  // файл будет установлен, если его нет в директории установки

    // если нет ветки Control Panel\My App\Test' (убрал под константу TEST_REG_SUB_KEY), в разделе HKEY_CURRENT_USER то создаём её
   
if not WinApi_RegKeyExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY) then
    begin
       
CreateRegKey(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, hKeyOpened); // создаём ветку
       
hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // те ветки не было то не было и ключа, создаём и его
   
end else // в противном случае если ветка есль, то проверям наличие там ключа
   
if not WinApi_RegKeyValueExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, TEST_REG_VALUE_NAME) then //если ключа нет
     
Result := hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // то создаём его
end;



работа с реестром здесь на чистом WinApi (!)

Тестируй! :)

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

nik1967, файл иконки необязательно таскать с собой. Её можно брать у винды. Посмотри в примере "Создание кастомного диалогового окна", в шапке.

tr011_tmn 15-08-2013 07:54 2201868

Цитата:

Цитата Johny777
верно, слетит только папка Redist с её содержимым »

проверил работает на ура, спасибо огромное.

Задачка на логику по работе с SelectComponent. Помогите решить, а то сам даже не знаю как подступиться.

Инсталлятор у меня включает 12 компонентов видимых пользователю, на его выбор, 2 из них под флагом Fixed, остальные по желанию пользователя. Но есть важный нюанс. При выборе более трех компонентов по выбору требуется что бы независимо от желания пользователя в папку {app} копировался специальный набор файлов. оптимизирующий работу этих выбранных компонентов.

Если на пальцах то:

при установке только компонентов с флагом Fixed: не копируем
при установке компонентов с флагом Fixed + 1-2 компонента по выбору: не копируем
при установке компонентов с флагом Fixed + 3 и более компонентов: копируем

Заранее благодарен за помощь

jiumx60rus 15-08-2013 09:00 2201884

Есть проблема: установка с параметрами silent и verysilent не работает (видимо из-за прочих плюшек во время установки). Можно ли как-то решить эту проблему (установить в тихом режиме)? Спасибо.

nik1967 15-08-2013 11:09 2201943

Johny777, благодарю! От иконки избавился, скрипт переписал. Оказалось ещё, что на ANSI не отображается бевел на панели выхода - исправил. Хотя сам пользуюсь UNICODE версией Inno.

icq99999999 15-08-2013 17:05 2202161

Цитата:

Цитата Johny777
Код: »

а с помощью какой команды скрыть все окна инстала ?

insombia 15-08-2013 18:19 2202203

icq99999999,
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID =wpSelectComponents) or (PageID =wpSelectProgramGroup) or (PageID =wpready) or (PageID =wpfinished) then
Result:= True;
end;
или
[setup]
DisableDirPage = yes
и т д

insombia 15-08-2013 19:24 2202243

icq99999999
procedure InitializeWizard();
begin
wizardform.WelcomeLabel1.hide;
и т д, можно ещё вообще все скрыть со страницы,если хочешь создать свою страницу

procedure InitializeWizard();
begin
with WizardForm do begin
InnerNotebook.Hide;
OuterNotebook.Hide;
Bevel.Hide;
end;

icq99999999 15-08-2013 21:29 2202312

Цитата:

Цитата insombia
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID =wpSelectComponents) or (PageID =wpSelectProgramGroup) or (PageID =wpready) or (PageID =wpfinished) then
Result:= True;
end; »

что то не получается данный код скрывает только последние страницы а мне нужно чтоб был тихий установщик

insombia 15-08-2013 21:52 2202330

icq99999999 гугл помогает на ура,вот например,если что ищи ещё там
http://forum.ru-board.com/topic.cgi?...767&start=1520

icq99999999 15-08-2013 23:50 2202418

Цитата:

Цитата Johny777
переписал, изучай: »

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

Shkutu 16-08-2013 12:17 2202607

nik1967, спасибо!:) Да, думаю это то, что надо)

Johny777 16-08-2013 12:23 2202611

Цитата:

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


теперь присутствует
обновил код http://forum.oszone.net/post-2200990-1009.html

nik1967 16-08-2013 12:24 2202612

Цитата:

Цитата Johny777
отмена так и не работает во время установки? »

Почему? Отмена то работает, не ставиться на паузу при стандартной установке при нажатии на отмену. Потому, что по умолчанию, при нажатии на отмену и появлении всплывающего сообщения(бла-бла, да, нет) визард форм становиться заблокированным(enabled:= false), что и является паузой, ну а в моём примере - нет.

icq99999999 17-08-2013 09:23 2203055

вопрос
можно ли отключить создание деинсталлятора ?

Mailchik 17-08-2013 09:49 2203063

icq99999999,
Код:

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


nik1967 17-08-2013 10:34 2203082

icq99999999,
Как бы справку нужно хоть иногда смотреть!
[Setup]: Uninstallable
Valid values:
yes or no, or a boolean expression
Default value:
yes

Description:
This determines if Inno Setup's automatic uninstaller is to be included in the installation. If this is yes or to a boolean expression evaluating to True the uninstaller is included. Otherwise, no uninstallation support is included, requiring the end-user to manually remove the files pertaining to your application.

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"

icq99999999 17-08-2013 11:14 2203092

Цитата nik1967:
Как бы справку нужно хоть иногда смотреть! »
я смотрел, но там указано только как отключить для компонента, а мне нужно было полностью убрать при компиляции

volga163@vk 17-08-2013 20:56 2203329

Johny777, Спасибо большое!

tr011_tmn 19-08-2013 15:35 2204103

Всем доброго дня.

подскажите можно ли добавить скролл с стандартному WizardForm.ComponentsList? нигде не могу найти информацию как вернуть его обратно после изменения стандартного размера.

Shkutu 19-08-2013 18:19 2204204

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

saurn 19-08-2013 21:06 2204281

Shkutu, чем стандартные Types и Components не устраивают:
Код:

[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "main"; Description: "Main Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help Files"; Types: full
Name: "help\english"; Description: "English"; Types: full
Name: "help\dutch"; Description: "Dutch"; Types: full

Или я не верно понял суть вопроса?

R.i.m.s.k.y. 20-08-2013 08:11 2204401

Цитата:

Цитата tr011_tmn
подскажите можно ли добавить скролл с стандартному WizardForm.ComponentsList? нигде не могу найти информацию как вернуть его обратно после изменения стандартного размера. »

тоже с таким столкнулся, пришлось увеличивать окно установщика

Shkutu 20-08-2013 12:12 2204498

saurn, смысл в том, что в зависимости от выбранного типа установки/набора компонентов нужно или выводить дополнительную страницу или не выводить. Я не совсем поняла, как это можно сделать с помощью стандартных Types и Components.

R.i.m.s.k.y. 20-08-2013 16:40 2204657

Цитата:

Цитата Shkutu
saurn, смысл в том, что в зависимости от выбранного типа установки/набора компонентов нужно или выводить дополнительную страницу или не выводить. Я не совсем поняла, как это можно сделать с помощью стандартных Types и Components. »

я бы tasks приплел
Код:

[Tasks]
Components: main; Name: desktopicon\user; Description: "For the current user only"; GroupDescription: "Additional icons:"; Components: main; Flags: exclusive unchecked
Components: help\dutch; Name: quicklaunchicon; Description: "Create a &Quick Launch icon"; GroupDescription: "Additional icons:"; Components: main; Flags: unchecked
Components: help\english; Name: associate; Description: "&Associate files"; GroupDescription: "Other tasks:"; Flags: unchecked


[Components]
Name: "main"; Description: "Main Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help Files"; Types: full
Name: "help\english"; Description: "English"; Types: full
Name: "help\dutch"; Description: "Dutch"; Types: full

если три компонента в Tasks не будут выбраны то страница будет пропущена

saurn 20-08-2013 17:11 2204680

Цитата:

Цитата Shkutu
Я не совсем поняла, как это можно сделать с помощью стандартных Types и Components. »

Например, так:
Код:

[Components]
Name: MyComps; Description: Files; Types: full;

[Code]
var
    My_Page: TWizardPage;

procedure InitializeWizard();
begin
  My_Page := CreateCustomPage(wpSelectComponents, 'Caption', 'Description');
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case PageFromID(PageID) of
        My_Page: Result := not IsComponentSelected('MyComps');
    end;
end;

Здесь через код создается кастомная страница. В функции ShouldSkipPage описано условие, при котором эта страница будет пропущена, или показана, если условие не выполнено. В данном случае условие это - если не отмечен компонент MyComps

Shkutu 20-08-2013 17:45 2204702

Цитата:

Цитата R.i.m.s.k.y.
я бы tasks приплел »

Извините, новичок с inno, не совсем понимаю, как это будет работать. Если можно, подробнее? Или где про "подробнее" почитать?
На всякий случай обрисую ситуацию более детально. В моем скрипте в зависимости от типа установки может запускаться установка дополнительного стороннего ПО. Выбор типа установки и, соответственно, компонентов, реализован с помощью Types и Components. Так вот в случае, если выбран тип с установкой дополнительного ПО, то нужно показать от этого ПО информацию о лицензии. И не показывать, если это ПО не устанавливается.
Пыталась использовать WizardSelectedComponents, чтобы отследить выбранные компоненты, но она как-то странно работает - вне зависимости от выбранного типа установки выдает или полный набор компонентов или вообще пустой список.
Ну вот как-то так:)

rezvorck 20-08-2013 18:12 2204719

Здравствуйте!
Не получается обработать параметр командной строки ни через ParamStr ни через GetCmdTail... В чем ошибка?!
читать дальше »

Код:

procedure InitializeWizard();
begin
  if ParamStr(1)='/message' then MsgBox('bla bla bla', mbInformation, mb_Ok);
end;

cmd -> setup.exe /message

saurn 20-08-2013 18:30 2204733

rezvorck,
Код:

function ParamCmd(): Boolean;
begin
    Result := Pos(' -mycmdparam', GetCmdTail) <> 0;
end;

procedure InitializeWizard();
begin
    if ParamCmd() then MsgBox('bla bla bla', mbInformation, mb_Ok);
end;


Nightwishh 20-08-2013 19:30 2204772

:yahoo: А можно как- нибудь защитить графику в папке темп, без Ботвы?

Shkutu 21-08-2013 14:38 2205134

saurn, огромное спасибо, помогло! :)

Shkutu 22-08-2013 13:02 2205600

Приветствую!
Еще вопрос образовался. А можно ли как-то у стандартной формы "Ready to Install" как-то изменить значение выводимой папки установки? Или для этого придется переопределить форму целиком, ну т е заменить стандартную на свою?

saurn 22-08-2013 13:25 2205610

Цитата:

Цитата Shkutu
как-то изменить значение выводимой папки установки? »

Поконкретней, что подразумевается под "изменить значение"?
P.S.
Немножко для справки: Ready to Install в данном случае не форма, а страница. Инсталятор в Inno строится таким образом, что имеет всего одну форму, на котрой в зависимости от ID страниц показываются или скрываются те или иные элементы. Управлять этими элементами можно в секции Code, через встроенные или самописные процедуры и функции. Но форма у мастера установки, как таковая, одна.

Shkutu 22-08-2013 14:01 2205633

saurn, спасиб за справку.
Цитата:

Цитата saurn
подразумевается под "изменить значение"? »

При установке когда пользователь выбирает папку для установки приложения - это не сама папка приложения, а некий родительский каталог, в котором потом создаются другие папки в зависимости от выбранных настроек и тд и приложение устанавливается уже в них. На стандартной странице Ready to Install выводится информация о установке, в частности сообщение "ReadyMemoDir=Папка установки:", а далее, собственно, папка установки. Но туда попадает только выбранный пользователем родительский каталог, а хотелось бы выводить путь именно до папки приложения.
Надеюсь, объяснила понятно:)

saurn 22-08-2013 14:20 2205644

Shkutu, как-то так:

Код:

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
  S: String;
begin
  if IsComponentSelected('имя нужного компонента') then
  S := S + 'Целевой каталог:' + NewLine + AddBackslash(Wizarddirvalue()) + 'имя нужной папки';

  S := S + NewLine + NewLine + MemoTypeInfo + NewLine + NewLine + MemoComponentsInfo + NewLine + NewLine + MemoGroupInfo;
  Result := S;
end;


Shkutu 22-08-2013 17:02 2205699

saurn, благодарю. UpdateReadyMemo - то, что нужно :)

Shkutu 27-08-2013 13:40 2208506

Всем доброго времени суток!
Возник вопрос, может кто в сталкивался или просто знает, как. Когда при установке программа помещается в "Программы и компоненты" панели управления, то обычно (как я понимаю) отображаемое там имя берется из AppName. Можно ли поменять это отображаемое там имя на какое-то, заранее неизвестное? Ну т е формировать это имя в зависимости от каких-то введенных пользователем данных. Использование Scripted Constants не помогло - судя по всему AppName инициализируется до того, как пользователь что-либо ввел.

nik1967 27-08-2013 15:18 2208540

Shkutu,
Справка!
[Setup]: UninstallDisplayName
Описание:
Определяет название программы на странице Установка и удаление программ Панели управления. Значение может содержать константы. Если директива не указана или пустая, инсталлятор использует значение директивы AppVerName секции [Setup].

Из-за ограничений Windows 9x/Me, значение не может превышать 63 символа.

Например:
UninstallDisplayName=My Program

saurn 27-08-2013 18:31 2208641

Shkutu, так пойдет?
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes
UninstallDisplayIcon={app}\MyProg.exe
UninstallDisplayName={code:DisplayName}
OutputDir=.


[Code]
var
   
InputPage: TInputQueryWizardPage;

function DisplayName(Name: String): String;
begin
   
Result := InputPage.Values[0];
end;

procedure InitializeWizard;
begin
   
InputPage := CreateInputQueryPage(wpSelectDir, 'Caption', 'Description', 'SubCaption');

    InputPage.Add('Name:', False);
    InputPage.Values[0] := 'DefaultName';
end;

Цитата:

Цитата Shkutu
то обычно (как я понимаю) отображаемое там имя берется из AppName »

Из UninstallDisplayName

Shkutu 27-08-2013 19:00 2208665

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

R.i.m.s.k.y. 27-08-2013 19:14 2208678

Цитата:

Цитата Shkutu
А нету (вдруг) ссылки на русскоязычную справку? »

в шапке первая строчка
Цитата:

Цитата Shkutu
А на кучу моих вопросов ответы можно найти, судя по всему, просто внимательнее читая документацию) »

да инно один из немногих продуктов в котором справка действительно справка

R.i.m.s.k.y. 28-08-2013 22:00 2209332

Видимо все вопросы исчерпали себя к 6-й части :)

________

Если мне не изменяет склероз был способ в TNewMemo помещать не просто текст, а файл rtf
господа состоятельные кроты, поделитесь примером, пожалуйста. В Lines.Text - содержимое rtf файла
Код:

  BestSettings := TNewMemo.Create(WizardForm);
  with BestSettings do
  begin
    Parent := WizardForm.ReadyPage;
    Lines.Text := CustomMessage('BestSettings');
//    Transparent := False;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(417);
    Height := ScaleY(206);
    WordWrap := True;
    ScrollBars := ssVertical;
  end;


Gnom_aka_Lexander 28-08-2013 22:19 2209342

R.i.m.s.k.y., мемо вроде как не поддерживает РТФ-форматирования напрямую. а вот в ричэдит загрузить рич-текст удается, насколько я помню, только таким способом:
Код:

    LoadStringFromFile(ExpandConstant('{tmp}\{#SetupSetting("LicenseFile")}'),S1);
    Lines.Text := S1;

S1 : AnsiString;
Хотя, вспомнил, таким способом я как раз таки грузил рич-текст туда, где не поддерживается рич-форматирование.

elmariacci 29-08-2013 11:15 2209539

такой вопрос,как соорудить показ превью компонентов в инсталлере,компонентов порядка 40 штук,к каждому нужно наглядное пояснение картинкой.Нашел пример для кастомной страницы,но там и картинка малая и потом всеравно вылазит страница компонентов

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

saurn 29-08-2013 15:55 2209654

elmariacci, http://forum.oszone.net/post-2169372-662.html

elmariacci 29-08-2013 16:45 2209674

и еще такой вопрос,попробовал использовать скрипт сделанный в game script generator,выдернуть оттуда только фоновое изображение и проигрыватель.После компиляции выдает ошибку:
внутренняя ошибка extracttemporaryfile isgsg.dll not found
в секции Files присутствует...Сама програмка создает еще дополнительно файл bin ,где соответственно лежит длл я так понял,мне bin не нужен -тк делаю патчер и вес порядка 100мб
сам скрипт ,если нужно

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

[Setup]
OutputDir=F:\1
AppName=WOT
AppVersion=1
DefaultGroupName=WOT
OutputBaseFilename=прицел
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
SolidCompression=yes
WizardImageStretch=False
DisableWelcomePage=True
DisableFinishedPage=True
UsePreviousSetupType=False
UsePreviousTasks=False
UsePreviousLanguage=False
FlatComponentsList=False
CreateAppDir=False
UsePreviousGroup=False
UninstallDisplayName=setup1
Encryption=True
InternalCompressLevel=ultra
Password=111111
PrivilegesRequired=none
Uninstallable=yes
CreateUninstallRegKey=yes
UninstallLogMode=overwrite
UninstallDisplayIcon={uninstallexe}

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

[Files]
Source: "F:\my\phone.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: "F:\my\linkin_park-wid.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: "F:\my\sound.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: CoolXP4Green.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: "F:\my\Прицел*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\{cm:UninstallProgram,WOT}"; Filename: "{uninstallexe}"

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

[code]
const
Indent=10;
Color = clblack;
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 ssSetBkgImage(FileName:PAnsiChar); external 'ssSetBkgImage@files:isgsg.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';
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('isgsg.dll');
ExtractTemporaryFile('linkin_park-wid.mp3');
ExtractTemporaryFile('sound.mp3');
ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('CoolXP4Green.cjstyles');
LoadSkin(ExpandConstant('{tmp}\CoolXP4Green.cjstyles'), '');

Result:=True;
end;

procedure InitializeWizard;
begin
ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'www.example.com', False,True,0,Indent);
ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000);
ExtractTemporaryFile('phone.jpg');
ssSetBkgImage(ExpandConstant('{tmp}')+'\phone.jpg');
WizardForm.Font.Color:=clLime;
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:=clblack;
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.WelcomeLabel1.Font.Color:=clLime;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clLime;
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.PageNameLabel.Font.Color:=clLime;
WizardForm.Bevel.visible:=False;
WizardForm.BeveledLabel.visible:=False;
WizardForm.Bevel1.visible:=False;
end;

procedure DeinitializeSetup;
begin
KillMP3Panel;
ssDeInitialize;
UnloadSkin();
end;

R.i.m.s.k.y. 29-08-2013 16:46 2209678

Gnom_aka_Lexander, не, в окне выходит такая бяка
Код:

{\rtf1\ansi\ansicpg1251\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1049\deflangfe1049{\fonttbl{\f0\froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}

R.i.m.s.k.y. 29-08-2013 18:01 2209732

elmariacci, Source: isgsg.dll; DestDir: {tmp}; Flags: noencryption solidbreak dontcopy

Gnom_aka_Lexander 29-08-2013 18:09 2209736

R.i.m.s.k.y., Встречный вопрос - чем не устраивает ричэдит?
Код:

var
  S1 : AnsiString;

procedure InitializeWizard();
begin
  LoadStringFromFile(ExpandConstant('{tmp}\{#SetupSetting("LicenseFile")}'),S1);
  with TRichEditViewer.Create(WizardForm) do
  begin
    Parent := WizardForm.ReadyPage;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(206));
    RTFText := S1;
  end;
end;


elmariacci 29-08-2013 18:18 2209738

Цитата:

Цитата R.i.m.s.k.y.
elmariacci, Source: isgsg.dll; DestDir: {tmp}; Flags: noencryption solidbreak dontcopy »

это я прописал,в секции код есть обращение к bin поидее,где-то ошибка в процедурах...

R.i.m.s.k.y. 29-08-2013 18:29 2209742

Цитата:

Цитата elmariacci
это я прописал,в секции код есть обращение к bin поидее,где-то ошибка в процедурах... »

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

Цитата:

Цитата Gnom_aka_Lexander
Встречный вопрос - чем не устраивает ричэдит? »

тем что я про него не знал

elmariacci 29-08-2013 18:47 2209753

Цитата:

Цитата R.i.m.s.k.y.
а) секция код и есть секция bin
б) при декомпиляции секция кода не вытаскивается, придется ванговать руками все чего не хватает »

так декомпиляции и небыло-после создания скрипта,пошел править в iss и при компиляции создается bin.А мне нужно,чтобы все файлы запаковывались в экзэшник

Gnom_aka_Lexander 29-08-2013 18:56 2209763

elmariacci, посмотри в секции Setup значения DiskSpanning и ReserveBytes, при наличии - удали. Только учитывай, что если ехе будет получаться больше 2-х гиг, то компилятор откажется компилировать твой инсталлятор.

elmariacci 29-08-2013 19:00 2209768

Цитата:

Цитата Gnom_aka_Lexander
посмотри в секции Setup значения DiskSpanning и ReserveBytes, при наличии - удали. Только учитывай, что если ехе будет получаться больше 2-х гиг, то компилятор откажется компилировать твой инсталлятор. »

их я удалил заранее,после этого перестал создаваться bin , но тогда выскакивает внутренняя ошибка extracttemporaryfile isgsg.dll not found.

R.i.m.s.k.y. 29-08-2013 19:17 2209776

elmariacci, флаг nocompression поставь
Код:

Source: isgsg.dll; DestDir: {tmp}; Flags: noencryption solidbreak dontcopy nocompression

elmariacci 29-08-2013 19:31 2209784

та же ошибка....внутренняя ошибка extracttemporaryfile isgsg.dll not found
читать дальше »
[Setup]
OutputDir=F:\1
AppName=WOT
AppVersion=1
DefaultGroupName=WOT
OutputBaseFilename=прицел
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
SolidCompression=yes
WizardImageStretch=True
DisableWelcomePage=True
DisableFinishedPage=True
UsePreviousSetupType=False
UsePreviousTasks=False
UsePreviousLanguage=False
FlatComponentsList=False
CreateAppDir=False
UsePreviousGroup=False
UninstallDisplayName=setup1
Encryption=True
InternalCompressLevel=ultra
Password=111111
PrivilegesRequired=none
Uninstallable=yes
CreateUninstallRegKey=yes
UninstallLogMode=overwrite
UninstallDisplayIcon={uninstallexe}

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

[Files]
Source: "F:\my\phone.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: isgsg.dll; DestDir: {tmp}; Flags: noencryption solidbreak dontcopy nocompression
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: "F:\my\sound1.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: "F:\my\sound.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: CoolXP4Green.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: "F:\my\Прицел*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\{cm:UninstallProgram,WOT}"; Filename: "{uninstallexe}"

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

[code]
const
Indent=10;
Color = clblack;
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 ssSetBkgImage(FileName:PChar);
external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PChar;IsShowMP3Info,IsBkgFrm Visible:boolean;ShowTimeMP3Info:integer;dBottom:integer);
external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;
external 'KillMP3Panel@files:isgsg.dll stdcall';
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('isgsg.dll');
ExtractTemporaryFile('sound1.mp3');
ExtractTemporaryFile('sound.mp3');
ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('CoolXP4Green.cjstyles');
LoadSkin(ExpandConstant('{tmp}\CoolXP4Green.cjstyles'), '');

Result:=True;
end;

procedure InitializeWizard;
begin
ExtractTemporaryFile('isgsg.dll');
ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'www.example.com', False,True,0,Indent);
ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000);
ExtractTemporaryFile('phone.jpg');
ssSetBkgImage(ExpandConstant('{tmp}')+'\phone.jpg');
WizardForm.Font.Color:=clLime;
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:=clblack;
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.WelcomeLabel1.Font.Color:=clLime;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clLime;
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.PageNameLabel.Font.Color:=clLime;
WizardForm.Bevel.visible:=False;
WizardForm.BeveledLabel.visible:=False;
WizardForm.Bevel1.visible:=False;
end;

procedure DeinitializeSetup;
begin
KillMP3Panel;
ssDeInitialize;
UnloadSkin();
end;

Gnom_aka_Lexander 29-08-2013 19:36 2209790

elmariacci, Password=111111 - попробуй эту строчку убрать. еще, когда запустишь инсталл, проверь в папке %TEMP% наличие этих файлов:
Цитата:

Цитата elmariacci
ExtractTemporaryFile('isgsg.dll');
ExtractTemporaryFile('sound1.mp3');
ExtractTemporaryFile('sound.mp3');
ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('CoolXP4Green.cjstyles'); »


elmariacci 29-08-2013 19:51 2209797

isgsg.dll
isskin.dll
другие не добавляются,теперь ошибка на стадии компиляции
и они по адрессу
Created temporary directory: C:\Users\chip\AppData\Local\Temp\is-70JG8.tmp

Gnom_aka_Lexander 29-08-2013 19:55 2209800

Цитата:

Цитата elmariacci
и они по адрессу
Created temporary directory: C:\Users\chip\AppData\Local\Temp\is-70JG8.tmp »

это уже не компиляция а выполнение из под компилятора. PrivilegesRequired=none - удаление этой строчки должно помоч

elmariacci 29-08-2013 20:35 2209834

я сам тут уже накрутил....удалил при этом строки ExtractTemporaryFile('isgsg.dll'); и заработало

laboart 31-08-2013 13:12 2210592

Приветствую!
Подскажите, можно ли создать страницу в инсталляторе, чтобы она отображалась после распаковки приложения?
Я сделал как в help, но не знаю как ее отобразить после распаковки

DBPage := CreateInputQueryPage(wpReady,
'Информация для соединения с базой данных MySQL', '',
'Введите данные для соединения с сервером и нажмите далее.');

Конечная цель - это распаковать программу, на странице DBPage попросить пользователя ввести данные для подключения к MySQL, далее занести эти данные в ini файл и проверить соединение с базой MySQL по введенным данным. И второй вопрос, как можно осуществить проверку успешного соединения с базой?

saurn 31-08-2013 20:01 2210746

laboart, кастомная страницы после страницы прогресса установки:
Код:

DBPage := CreateInputQueryPage(wpInstalling, 'Информация для соединения с базой данных MySQL', '', 'Введите данные для соединения с сервером и нажмите далее.');

Shkutu 02-09-2013 17:47 2211583

R.i.m.s.k.y., спасибо, экая я невнимательная:)
Вопрос появился. На этапе инсталляции пользователь вводит какие-то значения, которые дальше используются (с помощью Scripted Constants). Можно ли до этих значений (конкретно тех, что ввел пользователь) доступиться при деинсталляции?

Johny777 03-09-2013 14:59 2212018

Shkutu,

данные лучше хранить в реестре, понятное дело к ним есть доступ пока есть ключ.

как "На этапе инсталляции пользователь вводит какие-то значения"?
можешь показать код?
тогда может смогу написать соответствующий пример

Данные должны сохраняться сразу после ввода?

вот небольшой пример работы с реестром на чистом WinApi http://forum.oszone.net/post-2201802.html#post2201802
если тебе его не хватит, то скажи. Попробую сделать

Shkutu 03-09-2013 15:33 2212032

Johny777, ввод значений так:
[code]
Код:

procedure AskInstanceName();
begin
 Instancepage:= CreateInputQueryPage(wpSelectComponents,
  ExpandConstant('{cm:InstName}'), ExpandConstant('{cm:InstFolderName}'),
  ExpandConstant('{cm:ChooseInstFolderName}'));
  Instancepage.Add(ExpandConstant('{cm:InstName}'), false);
  if ActiveLanguage = 'russian' then
    Instancepage.Values[0]:= ExpandConstant('{#InstanceNameRus}')
  else Instancepage.Values[0]:= ExpandConstant('{#InstanceName}');
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var b: boolean;
    path:string;
    RunModeIdx:integer;
begin
 if (CurPageID=Instancepage.ID) then
  begin
  if ((RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\UCS\instances\' + Instancepage.Values[0]))
    and (DirExists(ExpandConstant('{app}')+'\UCS\'+Instancepage.Values[0]+'\Rk7Reference')))
  then
  begin
    MsgBox(ExpandConstant('{cm:InstNameErr}'), mbInformation, MB_OK);
    result:=false;
  end
  else
  begin
    Instancename:= Instancepage.Values[0];
    path:=ExpandConstant('{app}\UCS\')+Instancename+'\Rk7Reference\';   
    //b:=ForceDirectories(path);
    RefBasePath :=path+'base';     
    BasePathPage.Values[0] := RefBasePath;
    result:=true;
  end;   
  end
...
end;

function GetInstancename(param:string):string;
begin
 if Instancename='' then
  if ActiveLanguage = 'russian' then
    Instancename:= ExpandConstant('{#InstanceNameRus}')
  else Instancename:= ExpandConstant('{#InstanceName}');
 result:=Instancename;
end;

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

[Registry]
Root: "HKLM"; Subkey: "Software\UCS\instances\{code:GetInstanceName}"; ValueType: string; ValueName: "path"; ValueData: "{app}\UCS\{code:GetInstanceName}"

Вот и получается, что на момент деинсталляции не понятно (мне, по крайней мере), как доступиться до нужных данных, чтобы как раз удалить ненужные ключи реестра и ini файлы.

UPD. И еще нет ли какого-нибудь примера про то, как можно добавить форму к деинсталлятору (в InitializeUninstallProgressForm наверное)? А то у меня что-то толком не получается это сделать, а примеров на эту тему вообще не нашла (

El Sanchez 03-09-2013 19:24 2212134

Цитата:

Цитата Shkutu
С реестром не получится, т к значения в него пишутся тоже с учетом того, что ввел пользователь »

Shkutu, вы в реестр пишете свои данные не для мусора ради, а чтобы эти данные потом использовать. При деинсталляции вызывайте функцию RegGetSubkeyName, чтобы получить массив всех instances, потом в цикле перебираете и делаете черные дела.

Shkutu 03-09-2013 19:42 2212145

Цитата:

Цитата El Sanchez
реестр пишете свои данные не для мусора ради »

Естественно, чтобы использовать - лицензии проверять например.
Цитата:

Цитата El Sanchez
цикле перебираете »

Мне же не все инстансы (которых может быть целая куча) удалять надо, а какой-то конкретный. Собственно вопрос как раз в том, как этот самый конкретный определить.

Johny777 03-09-2013 20:22 2212162

Shkutu,
Цитата:

Цитата Shkutu
а какой-то конкретный »

просто сохраняй имя инстансы в директории установки в текстовом файле, и когда надо считывай из него текст. В качестве защиты от дурака скрой его
вот накатал функции сохранения текста в файле и чтения оттуда. Они на чистом WinApi
читать дальше »
Код:

#define A = (Defined UNICODE) ? "W" : "A"

const
   
OPEN_ALWAYS = 4;
    GENERIC_READ = $80000000;
    GENERIC_WRITE = $40000000;
    FILE_SHARE_READ = $00000001;
    FILE_SHARE_WRITE = $00000002;
    OPEN_EXISTING = 3;
    TRUNCATE_EXISTING = 5;
   
    INVALID_HANDLE_VALUE = -1;
   
    OFS_MAXPATHNAME = 128;

type
   
Pointer = Longint;
    POverlapped = Pointer;
    PSecurityAttributes = Pointer;


function CreateFile(lpFileName: String; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition,
  dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@Kernel32.dll stdcall';
 
function WriteFile(hFile: THandle; const Buffer: Pointer; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD;
  lpOverlapped: POverlapped): BOOL; external 'WriteFile@Kernel32.dll stdcall';
 
function ReadFile(hFile: THandle; Buffer: Pointer; nNumberOfBytesToRead: DWORD;
  var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; external 'ReadFile@Kernel32.dll stdcall';
 
function GetFileSize(hFile: THandle; lpFileSizeHigh: Pointer): DWORD; external 'GetFileSize@Kernel32.dll stdcall';
 
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';




function GetTextFromFile(const FileName: String; out Text: String): Boolean;
var
   
dwBytesRead: DWORD;
    FileSize: DWORD;
    hFile: THandle;
begin
   
hFile := CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    Result := hFile <> INVALID_HANDLE_VALUE;
    if Result then
    try
       
FileSize := GetFileSize(hFile, 0);
        SetLength(Text, FileSize);
        Result := ReadFile(hFile, CastStringToInteger(Text), FileSize, dwBytesRead, 0);
    finally
       
CloseHandle(hFile);
    end;
end;


function SaveTextToFile(const FileName, Text: String): Boolean;
var
   
dwByteWritten: DWORD;
    hFile: THandle;
begin
   
hFile := CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_ALWAYS or TRUNCATE_EXISTING, 0, 0);
    Result := hFile <> INVALID_HANDLE_VALUE;
    if Result then
    try
       
Result := WriteFile(hFile, CastStringToInteger(Text), Length(Text), dwByteWritten, 0);
    finally
       
CloseHandle(hFile);
    end;
end;



procedure InitializeWizard();
var
   
S: String;
begin
    if
SaveTextToFile('C:\file.txt', 'Shkutu') then
    if
GetTextFromFile('C:\file.txt', S) then
     
MsgBox(S, mbInformation, MB_OK);
end;


у меня нет доверия к встроенным
SaveString(s)ToFile
LoadString(s)FromFile
но если хочешь воспользуйся ими

или пиши своё собственное значение в реестр с именем инстансы только для самой себя, и читай её в деинсталяторе

Цитата:

Цитата Shkutu
как можно добавить форму к деинсталлятору »

объясни лучше на словах как оно должно выглядеть. Может не форму а страницу типа той которую ты создаёшь у себя в коде?
А то я честно говоря не знаю что мне писать :)

El Sanchez, раз уж ты здесь можешь пожалуйста проверить правильность моих функций SaveTextToFile и GetTextFromFile. Как бы я с флагами не напутал, хотя всё работает, но фиг знает

El Sanchez 03-09-2013 20:54 2212189

Цитата:

Цитата Shkutu
а какой-то конкретный »

Shkutu, какой? У вас в распоряжении полный список instances, не знаете какой выбрать? Кстати, где лежит деинсталлятор?

Цитата:

Цитата Johny777
правильность моих функций SaveTextToFile и GetTextFromFile. Как бы я с флагами не напутал, хотя всё работает, но фиг знает »

Johny777, сойдет.

Shkutu 04-09-2013 12:36 2212524

El Sanchez, да, полный список инстансов вытащить из реестра можно при желании, но вот выбрать конкретный действительно не могу.
Цитата:

Цитата El Sanchez
Кстати, где лежит деинсталлятор? »

Деинсталлятор кладу в ту же папку, куда устанавливается экземпляр программы. Думала, что с этим учетом получится вытащить хотя бы имя папки с помощью GetCurrentDir, но он почему-то вернул C:\Windows\System32.
Цитата:

Цитата Johny777
просто сохраняй имя инстансы в директории установки в текстовом файле, »

Эта идея тоже в голову приходила. Но если есть директория, то имя инстанса я и так могу вытащить (из реестра например). Но инстансов может быть сколько угодно и ставится они могу куда угодно, причем имя папки установки получается с учетом имени пользователя (такой вот извращенный способ, но идея не моя), поэтому вытащить нужный файлик тоже не получается.
Цитата:

Цитата Johny777
словах как оно должно выглядеть. Может не форму а страницу »

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

Dinvin4ester 05-09-2013 11:04 2213040

Ребята помогите пожалуйста . Вот скрипт - http://multi-up.com/900429 , но не видно прогресс бара (как устанавливается,строки) и еще бы хотелось музыку прописать . Буду рад помощи ..

El Sanchez 05-09-2013 11:16 2213049

Цитата:

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

Shkutu, тогда вы пишете в реестр мусор.

Цитата:

Цитата Shkutu
Деинсталлятор кладу в ту же папку, куда устанавливается экземпляр программы. »

Shkutu, вы все правильно сделали, это от вас я и хотел услышать. В каждой копии программы по деинсталлятору, удаляющего только саму копию и не трогая остальные. Только каждый из деинсталляторов должен быть готовым к удалению не только своей копии, но и родительской директории UCS, если он остался последним среди удаленных копий. Тоже самое и с реестром. Удаление файлов организовать через [UninstallDelete], удаление реестровых записей через [Registry] с нужными флагами:
читать дальше »

Код:

[UninstallDelete]
Type: filesandordirs; Name: {app}\UCS\instances\{code:GetInstanceName}
Type: dirifempty; Name: {app}\UCS\instances
Type: dirifempty; Name: {app}\UCS

[Registry]
Root: HKLM; Subkey: SOFTWARE\UCS; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances\{code:GetInstanceName}; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances\{code:GetInstanceName}; ValueType: string; ValueName: path; ValueData: {app}\UCS\{code:GetInstanceName}; Flags: uninsdeletevalue



Цитата:

Цитата Shkutu
деинсталлятора никаких страниц нет. »

Формы инсталлятора и деинсталлятора похожи и обе имеют страничный компонент TNewNotebook, так что ничто не мешает для деинсталлятора добавить свои страницы, только строить их с нуля нужно, шаблоны-функции Create*Page - это не для деинсталлятора. Вот пример, создается пустая страница, кнопка Далее для перехода на следующую страницу (если выборочных страниц больше одной делать, то необходима еще кнопка Назад), стандартная страница с прогрессом должна быть последней:
читать дальше »

Код:

//////////////////////////////////////////////////
procedure UninsNextButtonOnClick(Sender: TObject);
begin
    with
UninstallProgressForm.InnerNotebook do
    begin
       
ActivePage := Pages[ActivePage.PageIndex + 1];      // go to next page
       
if ActivePage.PageIndex = PageCount-1 then          // on last page...
       
begin
           
TButton(Sender).Hide;                          // ...hide Next button...
           
UninstallProgressForm.Close;                    // ...and close modal form
       
end;
    end;
end;

////////////////////////////////////////////////////
procedure UninsCancelButtonOnClick(Sender: TObject);
begin
   
UninstallProgressForm.ModalResult := mrAbort;
end;

////////////////////////////////////////////
procedure InitializeUninstallProgressForm();
var
   
Page: TNewNotebookPage;
    UninsNextButton: TButton;
begin
    with
UninstallProgressForm do
    begin
       
// create Next button
       
UninsNextButton := TButton.Create(UninstallProgressForm);
        with UninsNextButton do
        begin
           
Parent := UninstallProgressForm;
            Top := UninstallProgressForm.CancelButton.Top;
            Width := UninstallProgressForm.CancelButton.Width;
            Height := UninstallProgressForm.CancelButton.Height;
            Left := UninstallProgressForm.CancelButton.Left - Width - ScaleX(10);
            Caption := SetupMessage(msgButtonNext);
            OnClick := @UninsNextButtonOnClick;
        end;

        // modify Cancel button
       
CancelButton.Enabled := True;
        CancelButton.OnClick := @UninsCancelButtonOnClick;

        // create custom page
       
Page := TNewNotebookPage.Create(UninstallProgressForm);
        with Page do
        begin
           
Parent := UninstallProgressForm.InnerNotebook;
            Notebook := UninstallProgressForm.InnerNotebook;
            PageIndex := 0; // first page
       
end;

        // set active (first) page
       
InnerNotebook.ActivePage := InnerNotebook.Pages[0];

        // default page to last page
       
InstallingPage.PageIndex := InnerNotebook.PageCount-1;

        // show form
       
if ShowModal = mrAbort then Abort;
    end;
end;


vint56 05-09-2013 12:52 2213118

Dinvin4ester ты используеш внутреное сжатие inno setup а скрипт от isdone потому и не работает

пример http://rghost.ru/48577915

Dinvin4ester 05-09-2013 17:38 2213274

vint56,
Огромное спасибо за помощь .

Shkutu 05-09-2013 18:07 2213296

El Sanchez, спасибо, буду пробовать

Shkutu 06-09-2013 16:35 2213771

Привет. И снова вопрос. Можно ли закрыть окно инсталляции из кода, но без вывода стандартного диалога "хотите ли вы прервать процесс установки.. да/нет" (как это происходит при использовании wizardform.close())? Или у wizardform.close() отключить вывод этого самого диалога?

Johny777 06-09-2013 16:42 2213776

Shkutu, можно
в процедуре CancelButtonClick() в булев переменную Confirm пишешь False, чтоб не было диалога подтверждения, а в Cancel - True, чтоб прервать работу инсталла
читать дальше »
Код:

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
   
Confirm := False;
   
    Cancel := True;
end;


если тебе это нужно только во время установки то нужна проверка
читать дальше »
Код:

    if CurPageID = wpInstalling then
    begin
       
Confirm := False;
        Cancel := True;
    end;


Shkutu 06-09-2013 17:38 2213809

Johny777, то, что нужно, спасибо за помощь!:)

wertulll 06-09-2013 19:21 2213878

Ребят извеняюсь конечно за вопрос но может ктонибудь поможет ?собрал себе скрипт из разных примеров на основе ISDone всё вроди работает нормально вот только кажется мне что он какойта запутаный получился(можете глянуть пожалуйста может его можно както попроше можно реализовать ? http://rghost.ru/48601229

insombia 08-09-2013 17:22 2214658

wertulll нормальный там код,ты мой в некоторых скриптах не видел :happy:

TryRooM 10-09-2013 07:50 2215423

Помогите с удалением драйвера из директории system32\drivers.Система W64.Драйвер прописывается в обе директории SysWOW64 и System32.
Пробовал через секцию [UninstallDelete] удаляется только из SysWOW64, а директорию System32 в упор не видит, хотя прописывал
{sys}\driver\drv.sys и {win}\system32\drivers\drv.sys, реакции ноль.Как победить эту напасть.

R.i.m.s.k.y. 10-09-2013 22:47 2215858

TryRooM, читать в справке про режим x64

TryRooM 10-09-2013 23:41 2215873

Про это Flags: 64bit я в курсе, но как прикрутить этот флаг к удалению не пойму.

Fakt_37 11-09-2013 18:59 2216267

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

YURSHAT 11-09-2013 20:11 2216299

Цитата:

Цитата Fakt_37
Здравствуйте, подскажите как сделать чтоб при нажатии на картинку открывался сайт в браузере? »

Пример

Код:

[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа
DefaultGroupName=Моя программа

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

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

[Code_]
procedure OpenSite(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExecAsOriginalUser('open', 'http://www.innosetup.com/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure RedesignWizardForm;
begin
  with TBitmapImage.Create(WizardForm) do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(25), ScaleY(313), ScaleX(55), ScaleY(55));
    Cursor := crHand;
    ExtractTemporaryFile('Image.bmp');
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image.bmp'));
    OnClick := @OpenSite;
  end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


Fakt_37 12-09-2013 08:57 2216502

Цитата:

Цитата YURSHAT
Пример »

спасибо попробуем)

Shkutu 12-09-2013 14:05 2216643

Привет! Вопрос, можно ли поменять заглавие у стандартной формочки, выдаваемой MsgBox? Или свою надо рисовать для этого случая?

nik1967 12-09-2013 18:33 2216798

Shkutu, воспользоваться
PHP код:

function MsgBoxEx(AWndHWNDATextACaptionstringATypeAIconUINTATimeOutInteger): Integer

Правда она работает на инно только от китайских друзей.
Пример
Код:

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

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

[ code]
procedure InitializeWizard();                     
begin
  MsgBoxEx(0, 'Какое-то сообщение', 'Какой-то заголовок', MB_OK or MB_ICONINFORMATION, 0, 5{время до закрытия в сек. если 0 - таймер выкл.});
end;


Shkutu 12-09-2013 19:22 2216829

Цитата:

Цитата nik1967
Правда она работает на инно только от китайских друзей. »

Ну да, моя студия на эту функцию ругается. А не подскажете, где взять ту самую версию "от китайских друзей"?:)

И еще. Может кто-нибудь знает, есть ли где-нибудь список кодов ошибок?
А то приходится поневоле ковырять чужой скрипт, при попытке компиляции выдает "Internal error (20)". Не пойму, что за ошибка

nik1967 12-09-2013 20:04 2216862

Shkutu, http://innoultra.ru/
Ну или Расширенная версия Inno Setup от Restools

saurn 13-09-2013 08:20 2217135

Цитата:

Цитата Shkutu
Вопрос, можно ли поменять заглавие у стандартной формочки, выдаваемой MsgBox? »

Помимо расширенного MsgBoxEx от китайских собратьев, можно использовать системные MessageBox:
Код:

[code]
#define A = (Defined UNICODE) ? "W" : "A"

//const
//    MB_ICONINFORMATION = $40;
//    MB_ICONEXCLAMATION = $30;
//    MB_ICONQUESTION = $20;
//    MB_ICONSTOP = $10;
//    MB_ICONNONE = $10;
//    MB_SYSTEMMODAL = $1000;


function MessageBox(AWnd: HWND; mbText, mbCaption: String; mbType: Cardinal): Integer;
    external 'MessageBox{#A}@user32.dll stdcall';


function InitializeSetup(): Boolean;
begin
   
MessageBox(Application.Handle, 'Сообщение', 'Заголовок', MB_OK or $40);
end;


Shkutu 13-09-2013 13:33 2217258

nik1967, попробовала поставить инно от Restools, вроде все по инструкции, но скрипт даже не компилится, внезапно ругается на неизвестные данной версии inno сообщения в default.isl.
saurn, спасибо, то, что надо!:)

Johny777 13-09-2013 16:39 2217348

saurn, Shkutu, до кучи имплементация WinApi функции MessageBoxIndirect
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
входные аргументы по большей части вынес в перечисляемые типы. Так будет проще, чем с флагами
У этого диалогового окна есть возможности настройки, которых нет у встроенных диалоговых окон китайской версии:

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

#define A = (Defined UNICODE) ? "W" : "A"
const
   
MB_ICONHAND = $00000010;
    MB_ICONQUESTION_ = $00000020;
    MB_ICONEXCLAMATION = $00000030;
    MB_ICONASTERISK = $00000040;
    MB_USERICON = $00000080;
    MB_HELP = $00004000;
    MB_CANCELTRYCONTINUE = $00000006;

    MB_DEFBUTTON4 = $00000300;
   
    MB_APPLMODAL = $00000000;
    MB_SYSTEMMODAL = $00001000;
    MB_TASKMODAL = $00002000;
   
    IDTRYAGAIN = 10;
    IDCONTINUE = 11;
   
   


type
   
Pointer = Longint;
   
    _HELPINFO = record    { Structure pointed to by lParam of WM_HELP }
       
cbSize: UINT;          { Size in bytes of this struct  }
       
iContextType: Integer; { Either HELPINFO_WINDOW or HELPINFO_MENUITEM }
       
iCtrlId: Integer;      { Control Id or a Menu item Id. }
       
hItemHandle: THandle;  { hWnd of control or hMenu.    }
       
dwContextId: DWORD_PTR;{ Context Id associated with this item }
       
MousePos: TPoint;      { Mouse Position in screen co-ordinates }
   
end;
   
    HINST = THandle;

    TPRMsgBoxCallback = Pointer;
   
    _MSGBOXPARAMS = record
       
cbSize: UINT;
        hwndOwner: HWND;
        hInstance: HINST;
        lpszText: String;
        lpszCaption: String;
        dwStyle: DWORD;
        lpszIcon: String;
        dwContextHelpId: DWORD_PTR;
        lpfnMsgBoxCallback: TPRMsgBoxCallback;
        dwLanguageId: DWORD;
    end;
   
   
    ////////////////////////////////////////////////////////////////////
   
   
   
_MBOX_EX_BTNSET =
    (
        _mb_Abort_Retry_Ignore,
        _mb_Cancel_TryAgain_Continue,
        _mb_Ok,
        _mb_Ok_Cancel,
        _mb_Retry_Cancel,
        _mb_Yes_No,
        _mb_Yes_No_Cancel
    );
   
    _MBOX_EX_BTN =
    (
        _btn_Abort,
        _btn_Retry,
        _btn_Ignore,
        _btn_TryAgain,
        _btn_Continue,
        _btn_Ok,
        _btn_Cancel,
        _btn_Yes,
        _btn_No
    );
   
   
    _MBOX_EX_ICON =
    (
        _ico_Warning,
        _ico_Error,
        _ico_Information,
        _ico_Question
    );
   
    _MBOX_EX_SHOW =
    (
        _mb_Modal_App,
        _mb_Modal_System,
        _mb_Modal_Task
    );
   

function MessageBoxIndirect(const MsgBoxParams: _MSGBOXPARAMS): Integer; external 'MessageBoxIndirect{#A}@user32.dll stdcall';


procedure MessageBoxExDefHelpProc(var lpHelpInfo: _HELPINFO);
begin
   
MsgBox('Help', mbInformation, MB_OK);
end;


function MessageBoxEx(
                      const _hwnd: HWND; // хэнл окна - если равен 0 и включена кнопка "справка" сообщение о нажатии кнопки передаётся в каллбэк процедуру  MessageBoxExDefHelpProc; если хэндл не 0, то обрабатывам хелп сообщении WM_HELP окну с хэндлом _hwnd
                     
const Message: String; // текст сообщения
                     
const Caption: String; // заголовок окна
                     
const Buttons: _MBOX_EX_BTNSET; // набор кнопок
                     
const FocusButton: _MBOX_EX_BTN; // на какой из кнопок должен быть фокус
                     
const AddHelpButton: Boolean; // булев значение, добавление кнопки "Справка"
                     
const FocusHelpButton: Boolean; // установить фокус на кнопку "справка". Если True, то значение в FocusButton игнорируется
                     
const Icon: _MBOX_EX_ICON; // тип иконки
                     
const Modal: _MBOX_EX_SHOW // тип отображения окна
       
): _MBOX_EX_BTN; // возвращает нажатую кнопку
var
   
mp: _MSGBOXPARAMS;
    dwFlags: DWORD;
begin
    case
Buttons of
       
_mb_Abort_Retry_Ignore:
        begin
           
dwFlags := MB_ABORTRETRYIGNORE;
            if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON4
              else
            case
FocusButton of
               
_btn_Abort: dwFlags := dwFlags or MB_DEFBUTTON1;
                _btn_Retry: dwFlags := dwFlags or MB_DEFBUTTON2;
                _btn_Ignore: dwFlags := dwFlags or MB_DEFBUTTON3;
            else
               
dwFlags := dwFlags or MB_DEFBUTTON1;
            end;
        end;
        _mb_Cancel_TryAgain_Continue:
        begin
           
dwFlags := MB_CANCELTRYCONTINUE;
            if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON4
              else
            case
FocusButton of
               
_btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON1;
                _btn_TryAgain: dwFlags := dwFlags or MB_DEFBUTTON2;
                _btn_Continue: dwFlags := dwFlags or MB_DEFBUTTON3;
            else
               
dwFlags := dwFlags or MB_DEFBUTTON1;
            end;
        end;
        _mb_Ok:
        begin
           
dwFlags := MB_OK;
            if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON2
        end;
       
        _mb_Ok_Cancel:
        begin
           
dwFlags := MB_OKCANCEL;
            if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON3
              else
            case
FocusButton of
               
_btn_Ok: dwFlags := dwFlags or MB_DEFBUTTON1;
                _btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON2;
            else
               
dwFlags := dwFlags or MB_DEFBUTTON1;
            end;
        end;
        _mb_Retry_Cancel:
        begin
           
dwFlags := MB_RETRYCANCEL;
            if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON3
              else
            case
FocusButton of
               
_btn_Retry: dwFlags := dwFlags or MB_DEFBUTTON1;
                _btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON2;
            else
               
dwFlags := dwFlags or MB_DEFBUTTON1;
            end;
        end;
        _mb_Yes_No:
        begin
           
dwFlags := MB_YESNO;
            if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON3
              else
            case
FocusButton of
               
_btn_Yes: dwFlags := dwFlags or MB_DEFBUTTON1;
                _btn_No: dwFlags := dwFlags or MB_DEFBUTTON2;
            else
               
dwFlags := dwFlags or MB_DEFBUTTON1;
            end;
        end;
        _mb_Yes_No_Cancel:
        begin
           
dwFlags := MB_YESNOCANCEL;
            if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON4
              else
            case
FocusButton of
               
_btn_Yes: dwFlags := dwFlags or MB_DEFBUTTON1;
                _btn_No: dwFlags := dwFlags or MB_DEFBUTTON2;
                _btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON3;
            else
               
dwFlags := dwFlags or MB_DEFBUTTON1;
            end;
        end;
    end;
   
    case Icon of
       
_ico_Warning: dwFlags := dwFlags or MB_ICONEXCLAMATION;
        _ico_Error: dwFlags := dwFlags or MB_ICONHAND;
        _ico_Information: dwFlags := dwFlags or MB_ICONASTERISK;
        _ico_Question: dwFlags := dwFlags or MB_ICONQUESTION;
    end;
   
    if _hwnd <> 0 then
    case
Modal of
       
_mb_Modal_App: dwFlags := dwFlags or MB_APPLMODAL;
        _mb_Modal_System: dwFlags := dwFlags or MB_SYSTEMMODAL;
        _mb_Modal_Task: dwFlags := dwFlags or MB_TASKMODAL;
    end;

    mp.cbSize:= SizeOf(mp);
    mp.hInstance:= hInstance;
    mp.hwndOwner:= _hwnd;
    mp.lpszText:= Message;
    mp.lpszCaption:= Caption;
   
    if AddHelpButton then
    begin
       
dwFlags := dwFlags or MB_HELP;
        if _hwnd = 0 then mp.lpfnMsgBoxCallback := CallBackAddr('MessageBoxExDefHelpProc');
    end;

    mp.dwStyle:= dwFlags;

    case MessageBoxIndirect(mp) of
       
IDABORT: Result := _btn_Abort;
        IDRETRY: Result := _btn_Retry;
        IDIGNORE: Result := _btn_Ignore;
        IDTRYAGAIN: Result := _btn_TryAgain;
        IDCONTINUE: Result := _btn_Continue;
        IDOK: Result := _btn_Ok;
        IDCANCEL: Result := _btn_Cancel;
        IDYES: Result := _btn_Yes;
        IDNO: Result := _btn_No;
    end;
end;





function NextButtonClick(CurPageID: Integer): Boolean;
begin
    repeat
    until
MessageBoxEx(0, 'Test message', 'Test Caption', _mb_Cancel_TryAgain_Continue, _btn_TryAgain, True, False, _ico_Warning, _mb_Modal_Task) <> _btn_TryAgain;
end;


El Sanchez 13-09-2013 17:29 2217382

Цитата:

Цитата Shkutu
можно ли поменять заглавие у стандартной формочки, выдаваемой MsgBox? »

Shkutu, Inno названия заголовка и текст сообщения стандартных окон берет из языковых файлов isl, поэтому стоит воспользоваться секцией Messages. Например, меняем заголовок и текст диалового окна при выходе из инсталлятора:
Код:

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

[Messages]
ru.ExitSetupTitle=Выход
ru.ExitSetupMessage=Выйти?


Shkutu 13-09-2013 18:54 2217419

Цитата:

Цитата El Sanchez
текст сообщения стандартных окон берет из языковых файлов isl »

El Sanchez, текст сообщения - да. А вот что касается свойства Сaption у формы, выдаваемой MsgBox - я там такого не нашла, собственно, потому и спросила. Хотя может просто недостаточно внимательно искала.

El Sanchez 13-09-2013 19:04 2217427

Shkutu, тю, до меня только сейчас дошло, что вам нужно :). Тогда используйте то, что ребята выше насоветовали.

Shkutu 13-09-2013 19:52 2217446

El Sanchez, да, уже:))

Johny777 15-09-2013 22:51 2218494

У меня вопрос
как например та же WinApi функция MessageBox(Ex) обрабатывает входные флаги?
вот например мы отправляем туда флаги := MB_ICONINFORMATION or MB_TASKMODAL or MB_CANCELTRYCONTINUE
or складывает эти значения, если не ошибаюсь. Получается новое. А каким макаром теперь из этого числа выдрать те 3 флага назад?
спрашиваю, потому что не понимаю, но хочу понять, тк поняв смогу использовать ( плагиатъ ) тот же подход для своих процедур/функций значительно укоротив при этом их прототипы

и просьба: у кого есть мануал, хорошая книга (посоветуйте пожалуйста), где для самых тупых описана побитавая работа с числами (shr shl xor) или момет мне кто тут всё объяснить?
для меня это темнейший лес и гугл не помогает, я до сих пор эту тему не жую :(
PS: Подозреваю эта тема имеет прямое отношение к моему пред. вопросу

UPD по первому вопросу понял, но к полному пониманию побитовых операций это не привело
http://teran.karelia.pro/articles/item_4464.html

Mat_y 16-09-2013 12:52 2218716

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

Painkiller 16-09-2013 21:40 2218998

Цитата:

Цитата Mat_y
Приветствую всех.
А где можно подробненько почитать, как создать инсталлятор, который сам обновляется с сети и подгружает свежие файлы? »

В шапке все есть

Mat_y 17-09-2013 08:04 2219147

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

audiofeel 17-09-2013 12:53 2219274

Mat_y, если справку качнул, то правой кнопкой мыши>общие>разблокировать

Shegorat 17-09-2013 14:32 2219332

Цитата:

Цитата Johny777
как например та же WinApi функция MessageBox(Ex) обрабатывает входные флаги?
вот например мы отправляем туда флаги := MB_ICONINFORMATION or MB_TASKMODAL or MB_CANCELTRYCONTINUE
or складывает эти значения, если не ошибаюсь. Получается новое. А каким макаром теперь из этого числа выдрать те 3 флага назад?
спрашиваю, потому что не понимаю, но хочу понять, тк поняв смогу использовать ( плагиатъ ) тот же подход для своих процедур/функций значительно укоротив при этом их прототипы »

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

if (Flags and FM_MY_FLAG1) <> 0 then ...
Цитата:

Цитата Johny777
и просьба: у кого есть мануал, хорошая книга (посоветуйте пожалуйста), где для самых тупых описана побитавая работа с числами (shr shl xor) или момет мне кто тут всё объяснить? »

Логическое И (and) - для каждого бита операндов результат равен 1, если оба бита равны 1, иначе 0
Логическое ИЛИ (or) - для каждого бита операндов результат равен 1, если в одном из битов есть 1, иначе 0
Логическое отрицание (not) - каждый бит операнда инвертируется, если был 1 станет 0 и наоборот.
Логическое исключающее ИЛИ (xor) - для каждого бита операндов результат равен 1, если биты неравны между собой (наборы 0 1, 1 0). Если 2 единицы, то результат 0, также как и при двух нулях.
Логический сдвиг влево (shl) - сдвигает все биты операнда на n разрядов влево, в освободившееся место забиваются нули.
Логический сдвиг вправо (shr) - сдвигает все биты операнда на n разрядов вправо, в освободившееся место забиваются нули.

P.S. Подразумевается работа с двумя операндами.

Fakt_37 17-09-2013 17:53 2219445

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

saurn 17-09-2013 18:58 2219490

Цитата:

Цитата Fakt_37
скажите пожалуйста, почему может во время установки не работать кнопка отмена? »

Гляньте в процедуре CancelButtonClick. А лучше скрипт покажите.

Fakt_37 18-09-2013 14:56 2219840

Вложений: 1
saurn, Файл 104303

Mafia_forever 19-09-2013 12:53 2220327

Всем привет , у меня имеется 3 7zsfx архива , при установке я хочу сделать пошаговую распаковку архивов а не всех сразу через секция run , пож-та помогите , заранее спасибо !

Farser21 20-09-2013 20:35 2221126

Всем привет! Столкнулся с такой проблемой. У меня в установщике есть скрипт в разделе [code] который проигрывает музыку. Но я еще хочу перекрасить свою инсталку в черный цвет. Что и куда надо вставить чтобы скрипты не мешали друг другу и у меня был черный инстал) Заранее спасибо!

Johny777 21-09-2013 13:13 2221388

Mafia_forever, справка --> Setup Script Sections --> [Run] Section --> флаг waituntilterminated

Farser21, чтоб ответить на твой вопрос нужно видеть код

XXXler 21-09-2013 14:56 2221425

Кто-нибудь имел дело с импортом функции из dll/stdcall по индексу, а не имени (по типу паскалевского function Bla-bla-bla(name: type): type; stdcall; external 'dll.dll'; index 10;)?

Farser21 21-09-2013 17:12 2221477

Всем привет! Столкнулся с такой проблемой. У меня в установщике есть скрипт в разделе [code] который проигрывает музыку. Но я еще хочу перекрасить свою инсталку в черный цвет. Что и куда надо вставить чтобы скрипты не мешали друг другу и у меня был черный инстал) Заранее спасибо!

Вот код:
читать дальше »
[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 := 'Воспроизведение музыки'
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 := 'Приостановить музыку'
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 := 'Остановить музыку'
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;

Антон_Мураткин@vk 22-09-2013 09:52 2221782

Доброе время суток! Подскажите как сделать чтобы после установки программы, игры и т.п появлялись два разных ярлыка с разными названиями. Какой код и в какую секцию прописать
Заранее благодарю!

Nordek 22-09-2013 10:05 2221792

Антон_Мураткин@vk,
Код:

[Icons]
Name: {commondesktop}\My Program 1; Filename: {app}\MyProg.exe
Name: {commondesktop}\My Program 2; Filename: {app}\MyProg.exe

Если нужно чтоб ещё было в зависимости от выбора в задачах, то
Код:

[Tasks]
Name: desktopicon1; Description: {cm:CreateDesktopIcon} 1; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: desktopicon2; Description: {cm:CreateDesktopIcon} 2; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Icons]
Name: {commondesktop}\My Program 1; Filename: {app}\MyProg.exe; Tasks: desktopicon1
Name: {commondesktop}\My Program 2; Filename: {app}\MyProg.exe; Tasks: desktopicon2


Антон_Мураткин@vk 22-09-2013 10:22 2221797

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

А как сделать так чтобы эти два ярлыка запускали разные проги например: MyProg_86.exe и MyProg_64.exe чтобы было для каждой версии винды. Как это организовать?

vint56 22-09-2013 10:32 2221803

Антон_Мураткин@vk
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Icons]
Name: {commondesktop}\My Program 1; Filename: {app}\MyProg32.exe; Tasks: desktopicon; Check: Not IsWin64
Name: {commondesktop}\My Program 2; Filename: {app}\MyProg64.exe; Tasks: desktopicon; Check: IsWin64

Farser21
http://rghost.ru/48897864

Антон_Мураткин@vk 22-09-2013 11:14 2221818

vint56, Благодарю! Но в этой строчки наверное должно быть 32? Name: {commondesktop}\My Program 1; Filename: {app}\MyProg32.exe; Tasks: desktopicon; Check: Not IsWin64 здесь наверное должно быть 32?


Name: {commondesktop}\My Program 2; Filename: {app}\MyProg64.exe; Tasks: desktopicon; Check: IsWin64


И ещё вопросик. Как сделать удаление проги,игры и т.п? А то у меня какие то ошибки вылазиют при запуске удаления

Nordek 22-09-2013 11:28 2221821

Цитата:

Цитата Антон_Мураткин@vk
здесь наверное должно быть 32? »

Что 32?
Код:

; Check: Not IsWin64
; Check: IsWin64

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

Цитата:

Цитата Антон_Мураткин@vk
Как сделать удаление проги,игры и т.п? А то у меня какие то ошибки вылазиют при запуске удаления »

Код:

[Icons]
Name: {group}\{cm:UninstallProgram,Название программы}; Filename: {uninstallexe}


Антон_Мураткин@vk 22-09-2013 11:56 2221829

Nordek, Всё понял просто не догнал чуть-чуть.

Цитата:

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

Главное чтобы были два ярлыка на раб.столе и выбрать ярлык что бы запускать на своей разрядности системы. Вот мне как надо.

Создались два ярлыка на раб.столе
Пример: Program_32 Program_64
У меня система _32
У тебя например _64

Тогда с раб.стола я запускаю Program_32
А ты запускаешь Program_64

И опять же на пример: Есть папка Win32 и Win64 в них соответственно свой ехе файл как мне сделать как я писал выше про ярлыки? Что то совсем запутался

vint56 22-09-2013 12:06 2221837

Антон_Мураткин@vk тот пример который я привёл там будет создаваться один ярлык от разрядности системы если система 32 то ярлык будет MyProg32.exe если 64 MyProg64.exe просто зачем в 32 двух битной системе ярлык от 64

[Icons]
Name: {commondesktop}\My Program 1; Filename: {app}\Win32\MyProg32.exe; Workingdir: {app}\Win32; Tasks: desktopicon; Check: Not IsWin64
Name: {commondesktop}\My Program 2; Filename: {app}\Win64\MyProg64.exe; Workingdir: {app}\Win64; Tasks: desktopicon; Check: IsWin64

Антон_Мураткин@vk 22-09-2013 12:08 2221838

vint56, Ок с этим ясно.А какой же например брать ехе файл? что бы было как ты написал про ярлыки

vint56 22-09-2013 12:28 2221841

Антон_Мураткин@vk
читать дальше »

#define AppName "Crysis"
#define AppVersion "1.0"
#define MainExe "{app}\Bin32\crysis.exe"
#define MainExe64 "{app}\Bin64\crysis.exe"
#define MainExeDir Copy(MainExe, 1, RPos("\", MainExe)-1)
#define MainExe64Dir Copy(MainExe64, 1, RPos("\", MainExe64)-1)

[Setup]
AppName={#AppName}
AppVersion={#AppVersion}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";

[Icons]
Name: "{group}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Check: IsWin64
Name: "{group}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Check: not IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Tasks: desktopicon; Check: IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Tasks: desktopicon; Check: not IsWin64
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"

Антон_Мураткин@vk 22-09-2013 12:48 2221845

vint56,
Цитата:

#define AppName "Crysis"
#define AppVersion "1.0"
#define MainExe "{app}\Bin32\crysis.exe"
#define MainExe64 "{app}\Bin64\crysis.exe"
#define MainExeDir Copy(MainExe, 1, RPos("\", MainExe)-1)
#define MainExe64Dir Copy(MainExe64, 1, RPos("\", MainExe64)-1)
Вот это поставить перед [Setup] и изменить на моё название игры так же и путь до ехе файла

Цитата:

Name: "{group}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Check: IsWin64
Name: "{group}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Check: not IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Tasks: desktopicon; Check: IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Tasks: desktopicon; Check: not IsWin64
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}
А здесь надо что нибудь менять на своё? Вроде не надо!!!

Nordek 22-09-2013 13:58 2221878

Антон_Мураткин@vk,
Код:

Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"

Антон_Мураткин@vk 22-09-2013 14:56 2221922

Nordek, Да вы не поняли, эта строчка у меня есть. Но только когда уже установишь програму и хочешь её удалить она выдаёт всякие ошибки

Farser21 22-09-2013 18:09 2222067

vint56, Спасибо добрый человек)

Shkutu 24-09-2013 16:49 2223194

Приветствую!
Есть вопрос: можно ли в инно на момент установки приложения узнать, в какой из папок ({userprograms} или {commonprograms} ) будет создаваться папка с ярлыком? Ну т е, я так понимаю, что выбор инсталлятором папки зависит от прав пользователя. Можно этот момент (права пользователя на определенную папку) как-то отследить?

saurn 24-09-2013 17:36 2223216

Цитата:

Цитата Shkutu
Ну т е, я так понимаю, что выбор инсталлятором папки зависит от прав пользователя »

Выбор папки зависит от того, где вы указали инсталятору создавать ярлык в секции Icons:
{userprograms} - текущий пользователь.
{commonprograms} - все пользователи.

Shkutu 24-09-2013 19:01 2223280

saurn, а если имя папки не указано, то что будет использоваться по умолчанию? И это "по умолчанию" всегда одинаковое или зависит от каких-то настроек?

saurn 24-09-2013 20:08 2223322

Цитата:

Цитата Shkutu
а если имя папки не указано, то что будет использоваться по умолчанию? И это "по умолчанию" всегда одинаковое или зависит от каких-то настроек? »

Имя папки не может быть не указано. Константы играют ключевую роль в скрипте. Именно на основе констант создаются пути к тем или иным папкам: {app}, {group} и т.д. Если пользователь имеет права администратора, то константа common будет аналогична константе user.

Shkutu 25-09-2013 12:20 2223661

Извините, я немного не догоняю, видимо (
Цитата:

Цитата saurn
Имя папки не может быть не указано »

В моем скрипте
Код:

[Icons]
Name: "{group}\{#MyAppExeName}"; Filename: "{app}\{#MyAppExeName}"

Здесь {group} - это же вроде имя папки, которая будет создана в "Пуск"-> "Программы". А в каких именно программах (общих или конкретного пользователя) здесь не указано, т е не очень понятно, для папки {group} какая папка при таком задании ярлыка будет родительской {userprograms} или {commonprograms}.
И вопрос, собственно, в том, можно ли программно определить эту самую папку, ну или есть ли у пользователя права администратора.
Цитата:

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

Антон_Мураткин@vk 25-09-2013 12:42 2223674

Люди добрые, подскажите скрипта для распаковки FreeArc'ом? Самый простой без наворотов, чтобы просто распаковал во время установки. Заранее благодарю

Nordek 25-09-2013 12:55 2223690

Цитата:

Цитата Shkutu
Здесь {group} - это же вроде имя папки »

Это не имя папки, это путь/назначение.
В Inno это есть так называемая переменная как в Windows.
Например в Windows переменная %TEMP% в Inno это будет {tmp}.

Цитата:

Цитата Shkutu
А в каких именно программах (общих или конкретного пользователя) здесь не указано »

Обычно в общих "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\".

Цитата:

Цитата Антон_Мураткин@vk
Люди добрые, подскажите скрипта для распаковки FreeArc'ом? »

Смотри здесь.

saurn 25-09-2013 18:30 2223857

Цитата:

Цитата Shkutu
Здесь {group} - это же вроде имя папки »

{group} - это в будущем, скажем так, имя папки. Первоначально - это константа, переменная пути. На основе нее инсталятор создает папку с именем, указанным в секции Setup.
Цитата:

Цитата Shkutu
какая папка при таком задании ярлыка будет родительской {userprograms} или {commonprograms} »

{commonprograms}
Цитата:

Цитата Shkutu
Может, все-таки наоборот - если прав нет, то common будет аналогична user? »

Нет.

P.S.
Все константы подробно описаны в справке.

Shkutu 25-09-2013 18:47 2223866

Nordek, saurn, спасибо

El Sanchez 25-09-2013 20:58 2223957

Цитата:

Цитата saurn
{group} - это в будущем, скажем так, имя папки. »

Цитата:

Цитата Shkutu
Здесь {group} - это же вроде имя папки, которая будет создана в "Пуск"-> "Программы". »

saurn, Shkutu, {group} - это полный путь будущей программной группы, общей или персональной - это уже зависит от привилегий установщика, установленных директивой PrivilegesRequired (по умолчанию admin). Установщик с привилегиями admin/poweruser будет автоматом создавать ярлыки в общей программной группе (All Users/ProgramData), lowest - в персональной (профиле пользователя). Также для установщика с админскими привилегиями можно указать создавать ярлыки не в общей группе, а в персональной, для этого предусмотрена директива AlwaysUsePersonalGroup.

Цитата:

Цитата saurn
{commonprograms}
Цитата Shkutu:
Может, все-таки наоборот - если прав нет, то common будет аналогична user? »
Нет. »

saurn, вообще-то, да.

Цитата:

Цитата Nordek
Например в Windows переменная %TEMP% в Inno это будет {tmp}. »

Nordek, вообще-то, нет.

Nordek 25-09-2013 22:55 2224044

Цитата:

Цитата El Sanchez
lowest - в персональной (профиле пользователя). »

Смысла не понимаю использования lowest.
Поясню почему:
Есть некоторые программы которые установленные установщиком Inno. Запуская простым кликом, запускаются без запроса UAC. Но здесь есть одно "Но", порой выбивают ошибку, и всё потому, что не могут прочитать конфигурационный файл находящийся в программной папке. С одной стороны да, то что даже если запроса от UAC не было, и если выбивает ошибку, то их нужно запускать из под администратора. Но с другой стороны, многие думают что нужно давать инсталлятору какие-то привилегии, на самом деле как оказалось административные права не нужны чтобы запустить программу без ошибки.

P.S Данную проблему почти решил и знаю почему это происходит, но пока ещё не реализовал для инсталлятора.

El Sanchez 26-09-2013 13:12 2224312

Цитата:

Цитата Nordek
Смысла не понимаю использования lowest. »

Nordek, поясняю привилегии установщика:
  1. admin - однопользовательская установка; установщик имеет права пользователя из группы Администраторов в системе; установленная программа находится в системной папке Program Files, которой пользуются все; удаление программы только пользователем из группы Администраторов.
  2. poweruser - однопользовательская установка; установщик имеет права не ниже прав пользователя из группы Опытные пользователи в системе; установленная программа находится в системной папке Program Files, которой пользуются все; удаление программы только пользователем минимум из группы Опытные пользователи.
  3. lowest - многопользовательская установка; установщик имеет права пользователя из группы Пользователи в системе (пользователь из группы Администраторы, запустивший установщик, приравнивается к пользователю из группы Пользователи); установленная программа находится в профиле пользователя, запустившего установку (обычно в %APPDATA%); удаление индивидуально для каждого пользователя (кроме админа, тому все можно грохать).
  4. none - однопользовательская/многопользовательская установка; установщик имеет права пользователя, запустившего установку, поэтому логика скрипта должна это учитывать; установленная программа находится в Program Files/профиле в зависимости от пользователя, запустившего установку; удаление аналогично.

Цитата:

Цитата Nordek
Поясню почему: »

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


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


Johny777 26-09-2013 13:13 2224315

El Sanchez,
Цитата:

Цитата El Sanchez
Например в Windows переменная %TEMP% в Inno это будет {tmp}. »
Nordek, вообще-то, нет. »

как же?
мне пришлось вплотную с этим столкнуться, те мне нужны пути для инсталла
и темп в первую очередь

пути к папкам я получаю таким макаром (код Delphi):
читать дальше »
Код:

function GetSpecialFolderPath(const csidl: Integer): String;
var
    Buff: array[ 0..MAX_PATH] of Char;
begin
    if SHGetSpecialFolderPath(0, Buff, csidl, False) then Result := Buff;
end;


http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
из констант
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
мне нужны только
CSIDL_DESKTOP
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_COMMON_DOCUMENTS
CSIDL_PROGRAM_FILES
CSIDL_PROGRAMS
CSIDL_DESKTOPDIRECTORY
CSIDL_MYDOCUMENTS
CSIDL_PROGRAM_FILESX86

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

а путь к папке Temp только одним способом. Другого не знаю (код Delphi):
читать дальше »
Код:

function GetTemp(): String;
var
    Buff: array [0..MAX_PATH] of Char;
begin
    if GetTempPath(Length(Buff), Buff) > 0 then Result := Buff;
end;


http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
и этот путь тот же самый, в котором инно создаёт временную папку и именно этот темп откроется если вбить %TEMP% в "Выполнить"
исходники инно по этому поводу я не смотрел, но уверен что пути которыми она заменят константы в строке она берёт именно при помощи вышеупомянутых функций

В общем хотелось бы понять, чтоб потом у меня весь инсалл не рухнул при запуске не из под Админа,

Gnom_aka_Lexander 26-09-2013 13:37 2224334

Цитата:

Цитата Johny777
как же? »

Просто. Константа {tmp} это путь к временной папке инсталлятора. А системная переменная %TEMP% это временная папка системы. собственно {tmp} - это подпапка внутри %TEMP%. И я совершенно не понимаю, при чем тут Delphi. К инно она относится только тем боком, что данный инструмент скомпилен на Delphi и имеет тот-же язык для секции [code].
P.S. даже не тот-же, а несколько отличающийся. объектная структура классов построена чуток по другому, чем в дельфи.

El Sanchez 26-09-2013 14:43 2224375

Цитата:

Цитата Johny777
а путь к папке Temp только одним способом. Другого не знаю (код Delphi): »

Johny777, выбирай:
Код:

GetTempDir
GetEnv('TEMP')
ExtractFileDir(ExpandConstant('{tmp}'))


Gnom_aka_Lexander 26-09-2013 14:45 2224377

El Sanchez, Еще можно добавить
ExpandConstant('{%TEMP}')
Вроде так.

XXXler 26-09-2013 14:48 2224378

Цитата:

Цитата Johny777
пути к папкам я получаю таким макаром (код Delphi): »

все нужные вам константы уже есть в Inno (см. спавку), в коде их можно получить используя ExpandConstant('{some_constant}')

Цитата:

Цитата Johny777
а путь к папке Temp только одним способом. Другого не знаю (код Delphi): »

опять-же, если хотите использовать именно %TEMP%, его можно получить через константу {%temp} , но настоятельно рекомендуется использовать {tmp} во избежание проблем с существующими/занятыми файлами и необходимостью очистки папки в конце процесса

Johny777 26-09-2013 16:02 2224415

XXXler,
Цитата:

Цитата XXXler
все нужные вам константы уже есть в Inno (см. спавку) »

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

Gnom_aka_Lexander,
Цитата:

Цитата Gnom_aka_Lexander
И я совершенно не понимаю, при чем тут Delphi. »

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

El Sanchez,
Цитата:

Цитата El Sanchez
выбирай: »

GetEnv = (WinApi) GetEnvironmentVariable
а какую функцию лучше использовать? Мне кажется GetTemPath возвращает то же, что и GetEnvironmentVariable
тк цитирую отсюда http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
читать дальше »
Код:

Remarks

The GetTempPath function checks for the existence of environment variables in the following order and uses the first path found:

    The path specified by the TMP environment variable.
    The path specified by the TEMP environment variable.
    The path specified by the USERPROFILE environment variable.
    The Windows directory.


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

function GenTempFolserUniqueName(): String;
var
    FSobj: Variant;
begin
    try
        FSobj := CreateOleObject('Scripting.FileSystemObject');
        Result := FSobj.GetTempName;
    except
        Result := 'SourceEngine15_' + IntToStr(GetTickCount());
    end;
end;


Nordek 26-09-2013 17:44 2224463

Цитата:

Цитата El Sanchez
поясняю привилегии установщика: »

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

Цитата:

Цитата El Sanchez
тут либо ошибка сборщика, допустившего расположение конфигурационного файла в месте, недоступном простому обывателю, либо ошибка разработчика программы, не сумевшего заставить свое приложение читать свой же конфигурационный файл. »

Сборщику? Разработчику?
Простой пример c Akelpad

Если нету, то установи Akelpad чтоб убедиться.
Если переключить на то чтоб настройки сохранялись в ini, переключи, потом примени

и тут тебя ждёт большой облом
.
Как видишь ничего не применилось.
Все потому, что надо было непросто запустить, а запустить аж от администратора.
Есть способ чтоб запускать Akelpad обычным способом и чтоб применялись без администратора.
Так что не сборщик, и даже не разработчик в этом не виноват.

El Sanchez 26-09-2013 21:37 2224563

Цитата:

Цитата Johny777
GetEnv = (WinApi) GetEnvironmentVariable
а какую функцию лучше использовать? Мне кажется GetTemPath возвращает то же, что и GetEnvironmentVariable »

Johny777, (Inno) GetEnv = (WinApi) GetEnvironmentVariable, (Inno) GetTempDir = (WINAPI) GetTempPath. Первую для общего применения, вторую для конкретного (Temp).

Цитата:

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

Johny777, что-то останавливает?

Цитата:

Цитата Johny777
к слову рандрмное имя получаю таким макаром »

Johny777, можешь использовать GetTempFileName.


Цитата:

Цитата Nordek
Простой пример c Akelpad »

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

Nordek, ну, все правильно. В манифесте приложения указан уровень привилегий asInvoker, означающий, что приложение будет запущено с теми же разрешениями, что и запустивший его процесс. Для системы с UAC запуск такого приложения не является чем-то таким, что требует администраторских прав, поэтому приложение будет запущено с правами обычного пользователя. На скриншоте-же изображен отлуп приложению с правами пользователя при попытке записать что-то в файл, находящегося в системной директории (программной папке AkelPad-а в Program Files). Тут либо ПКМ -> Запуск от имени Администратора, либо наличие работающего файла AkelFiles\AkelAdmin.exe, предназначенного для повышения прав при необходимости записи в защищенные файлы.
P.S. Лирическое отступление


Nordek 27-09-2013 10:41 2224750

Цитата:

Цитата El Sanchez
поэтому приложение будет запущено с правами обычного пользователя. »

Даже и это не совсем так.

Цитата:

Цитата El Sanchez
Тут либо ПКМ -> Запуск от имени Администратора »

Видишь ли, я тут тоже думал что без ПКМ -> Запуск от имени Администратора не обойтись. А оказалось то оно не так, совсем не так. Это заморочки самой винды и её безопасности. Админ тут вообще не причём.

Цитата:

Цитата El Sanchez
либо наличие работающего файла AkelFiles\AkelAdmin.exe »

Это тоже не то. Да и вообще не в ту степь полез.

Ну, думайте думайте.
Это как раз будет задача для всех: Как после установки запустить программу простым запуском, менять настройки не прибегая к запуску админа.
А я пока поищу реализации в Inno, может найду.

XXXler 27-09-2013 10:58 2224755

Цитата:

Цитата Nordek
Видишь ли, я тут тоже думал что без ПКМ -> Запуск от имени Администратора не обойтись. А оказалось то оно не так, совсем не так. Это заморочки самой винды и её безопасности. Админ тут вообще не причём. »

Конкретно в семерке это проблема автоотключения виртуализации при указанном в манифесте приложения RequestedExecutionLevel - до версии с AkelAdmin.exe все работало и сохранялось в %LOCALAPPDATA%\VirtualStore

Dinvin4ester 28-09-2013 22:19 2225436

Ребята всем привет . Что делаю не так - http://sendfile.su/873653.
Удалил:
Выбор компонентов
Язык интерфейса:
Русский
Английский
Язык озвучки:
Обновить DirectX
Установить Nvidia PhysX
Установить Microsoft Visual C++ Redist
Установить Games for Windows LIVE
Но они все-равно остались , точнее в само инсталле такое и так далее Помогите пожалуйста .Как их удалить ?

Nordek 28-09-2013 22:27 2225441

Цитата:

Цитата XXXler
AkelAdmin.exe все работало и сохранялось в %LOCALAPPDATA%\VirtualStore »

Да забудь ты про AkelAdmin. Можешь любую portable программу (которая запускается из под обычного пользователя не запрашивая адм.прав и имеет рядом конфигурационный файл (в пример AIMP, Opera и обе portable)) засунуть в папку PF на системном диске и увидеть как она себя там будет вести. Но не суть, у меня есть такая для которой при установки мало того что конфиг суётся в PF, так ещё и dll-ки регистрируются (это не говоря о том что вторые настройки помещаются в корень системного диска). Суть одна, запустить подобную программу из под пользователя так чтобы при изменении, настройки записывались в конфиг.
А не в хитрых махинациях с перемещением конфига.

audiofeel 29-09-2013 02:25 2225522

Цитата:

Цитата Dinvin4ester
Ребята всем привет . Что делаю не так - http://sendfile.su/873653. »

держи = http://rghost.ru/49036643

Dinvin4ester 29-09-2013 11:37 2225605

audiofeel,
Огромное спасибо .

XXXler 29-09-2013 11:47 2225609

Цитата:

Цитата Nordek
Суть одна, запустить подобную программу из под пользователя так чтобы при изменении, настройки записывались в конфиг.
А не в хитрых махинациях с перемещением конфига. »

Суть тут в том, что на NTFS-томе в системные папки у обычного пользователя нет доступа на запись еще со времен появления NT4.0. В NT6.x при включенном UAC для "старых приложений" используется виртуализация файловой системы, которая при недостатке прав записи в системную папку перенаправляет файл в папку %LOCALAPPDATA%\VirtualStore, обеспечивая при этом нужные права и многопользовательское хранение настроек. На 2000/XP ничего, кроме ругани на невозможность записи конфига, пользователь с пониженными правами не увидит.

Цитата:

Цитата Nordek
Можешь любую portable программу (которая запускается из под обычного пользователя не запрашивая адм.прав и имеет рядом конфигурационный файл (в пример AIMP, Opera и обе portable)) засунуть в папку PF на системном диске и увидеть как она себя там будет вести. »

А вы Inno Setup используете как SFX? Или к чему вся эта портабельность?

Dinvin4ester 29-09-2013 12:18 2225621

audiofeel,
Только теперь прогрес бар не отображается .

audiofeel 29-09-2013 15:36 2225712

Цитата:

Цитата Dinvin4ester
Огромное спасибо . »

для этого есть кнопочка "полезное сообщение"

Цитата:

Цитата Dinvin4ester
Только теперь прогрес бар не отображается . »

проверил, все норм
архиватор 'FreeArc", сжато без инсайдов, прекомп и среп и тд, если у вас с ними то необходимо раскоментировать в начале скрипта
;#define PrecompInside
;#define SrepInside
;#define precomp "0.42"
;#define unrar
;#define XDelta
;#define PackZIP

Dinvin4ester 29-09-2013 15:56 2225719

audiofeel,
Что я делаю не так ? Пользуюсь только средствами инно .

audiofeel 29-09-2013 16:22 2225736

Цитата:

Цитата Dinvin4ester
Пользуюсь только средствами инно . »

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

Dinvin4ester 29-09-2013 16:30 2225740

audiofeel,
Тогда может стандартный сделать ? Просто нравится их инсталл , хотел использовать его .

audiofeel 29-09-2013 17:13 2225758

Цитата:

Цитата Dinvin4ester
Тогда может стандартный сделать ? »

без исдон, с "родным" прогресс баром
http://rghost.ru/49046726

Dinvin4ester 29-09-2013 18:30 2225785

audiofeel,
Уважаю знающих людей в этом деле (ремесле) . И еще раз спасибо .

Nightwishh 29-09-2013 18:41 2225794

Вложений: 1
Всем привет. У меня вопрос по поводу объекта TPanel. В инсталеке есть слайд шоу на WizardForm-е и панель находиться на WizardForm-е и при смене картинок панель запоминает предыдущую картинку. Можно что-нибудь с ней сделать? Скрипт, думаю, ненадо выкладывать.

sergey3695 01-10-2013 11:04 2226607

Цитата:

Цитата Nightwishh
Скрипт, думаю, ненадо выкладывать. »

В кой то веке,да!
Начну с того что там двигается не TPanel,а прозрачная картинка. (этого элемента там нет(TPanel))
Картинки в оригинальном скрипте там просто меняются на заднем фоне,походу ты решил что-то переделать.
В данном скрипте у тебя прикрутить IsSlideShow и т.д. для смены картинки не получится. Можно сделать затухание картинок используя Transparent,но это сильно грузит систему. (если учесть что должен будет распаковываться архив,да и ещё это,будет жесть). Что ты собрался сделать мне не понятно.
И да, панель запоминает предыдущую картинку? это как?

Nightwishh 01-10-2013 15:01 2226759

sergey3695, Поясняю ситуацию. Используется обычное слайдшоу с картинками в формате .bmp (не IsSlideShow) и лежат слайды на WizardForm. Есть музыкальная кнопка с текстурами в формате .bmp, где как раз используеться панель размером 38*35 пикс. (на неё уже ложиться текстура и т.д. (это уже не важно!)) тоже на WizardForm. Так вот, при смене слайда в слайд шоу, на панеле (подчёркиваю на панели)отпечатывается кусок предыдущего слайда и при наведении на панель мышкой, она снова становиться прозрачной (Panel).

sergey3695 01-10-2013 20:17 2226967

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

vahe-91 01-10-2013 21:49 2227021

:hi:
Если в скрипте написать так
Код:

[Files]
Source: "D:\12\*.*"; DestDir: "{app}\111"; Flags: ignoreversion;

или

Код:

[Files]
Source: "D:\12\*"; DestDir: "{app}\111"; Flags: ignoreversion;

то установщик принимает только файлы которые есть в папке D:\12\, а мне нужно чтобы он принимал подпапки D:\12\ тоже. Как сделать, чтобы он принимал и файлы и подпапки вместе, кроме указания подпапок вручную ?. Помогите новичку в inno setup.

nik1967 01-10-2013 22:09 2227031

vahe-91, ну справка же...
Секция [Files]
Flags
recursesubdirs
Указывает компилятору или инсталлятору также искать файлы с указанным именем/маской в подпапках папки.

Nordek 01-10-2013 22:59 2227053

Цитата:

Цитата vahe-91
то установщик принимает только файлы которые есть в папке D:\12\ »

Ну. Просто в "Inno Setup Compiler" создай демо скрипт, на третьей странице выбери "Добавить папку"
В созданном скрипте увидишь чем дополнился Flags
Код:

Source: D:\12\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Можешь в ISTool перейти в "Файлы и каталоги"
Два раза кликаешь по элементу и выбираешь что тебе нужно
а именно
Обрабатывать подкаталоги - recursesubdirs
Создавать все подкаталоги - createallsubdirs

Либо в Inno Script Studio, переходишь в "Файлы"
Два раза кликаешь по элементу
переходишь в "Детали » (Де)Инсталл" и выбираешь что тебе нужно
а именно
recursesubdirs - Обрабатывать подкаталоги
createallsubdirs - Создавать все подкаталоги.

vahe-91 01-10-2013 23:21 2227067

nik1967, Nordek, спасибо, в справке про секцию files все смотрел, кроме флагов :teeth:

Dinvin4ester 02-10-2013 20:57 2227578


Вопрос снят .Прочел в справке что это лимит.

Alloc 05-10-2013 15:26 2229017

Приветствую, уважаемые форумчане!
Поделитесь пожалуйста опытом и знаниями касательно скрипта ISDone. Вообщем проблема в следующем:

Пытаюсь сделать репак игры. Беру все файлы игры и запаковываю их в архив FreeArc'ом (без сжатия). Полученный файл обрабатываю "Precomp'ом". Далее созданный ".pcf" - файл обрабатываю "Srep'ом". И наконец Полученный ".srp" - файл упаковываю тем же FreeArc'ом, но уже на "Ультра". Как мне потом его распаковать используя скрипт ISDone более грамотно?

Буду вам очень признателен за помощь.
Заранее спасибо!

Gnom_aka_Lexander 05-10-2013 15:30 2229022

Alloc, так-же, но в обратном порядке, в скрипте примере все есть. не забывать удалять промежуточные данные (в примере все это тоже есть)

Alloc 05-10-2013 15:48 2229030

Gnom_aka_Lexander, спасибо за ответ. А одной строкой невозможно это сделать? И подскажите еще пожалуйста, как использовать "arc.ini"? для чего он нужен?

Gnom_aka_Lexander 05-10-2013 15:55 2229037

Цитата:

Цитата Alloc
А одной строкой невозможно это сделать? »

Нет.
Цитата:

Цитата Alloc
как использовать "arc.ini" »

Никак. это конфигурационный файл freeArc, просто нужно при компиляции подложить тот arc.ini, который был использован при сжатии.

Alloc 05-10-2013 16:14 2229052

Gnom_aka_Lexander, подскажите тогда, как в строке "Извлечение файлов:" сделать так, что бы показывались только извлекаемые файлы игры а не архивы .arc; .srep... как например у "R.G. Origami"? Может в самих функциях "ISArcExtract", "ISPrecompExtract" это можно настроить?

заранее спасибо!

Gnom_aka_Lexander 05-10-2013 16:36 2229065

Alloc, никак. при распаковке последнего архива так и будет. Да и при распаковке каждого, собственно, так и происходит - отображается имя именно того файла, который в данный момент извлекается.

Alloc 05-10-2013 16:38 2229066

Gnom_aka_Lexander, спасибо за помощь)

Alloc 05-10-2013 18:13 2229128

Gnom_aka_Lexander, подскажите, я правильно делаю?

Код:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\Data.bin'), ExpandConstant('{app}\Data.srp'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
if not ISSRepExtract ( 0, 0, ExpandConstant('{app}\Data.srp'),ExpandConstant('{app}\Data.pcf'), false) then break;
if not ISPrecompExtract ( 0, 0, ExpandConstant('{app}\Data.pcf'), ExpandConstant('{app}\Data.arc'), false) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{app}\Data.arc'), ExpandConstant('{app}\'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;


Gnom_aka_Lexander 05-10-2013 18:21 2229132

Alloc, нет. Справка, описание функций. В первой все в порядке, вот в последующих -
function ISSrepExtract (CurComponent:Cardinal; PctOfTotal:double; InputFile, OutputFile:string; DeleteInFile:boolean):boolean;
тут нужно true. в остальных последующих тоже.
(Из справки - DeleteInFile - удаление исходного архива после распаковки.)

Alloc 05-10-2013 18:24 2229138

Gnom_aka_Lexander, все, спасибо большое. я понял

nik1967 05-10-2013 23:34 2229275

Цитата:

Цитата Alloc
А одной строкой невозможно это сделать? »

Возможно, при использовании CLS: SrepInside, PrecompInside, MSC (media streams compressor)
Естественно, что и запаковывать нужно с помощью этих CLS.

Alloc 06-10-2013 14:24 2229517

nik1967, Спасибо за ответ. Пожалуйста, можете немного по подробнее об этом... я пробовал еще так:

Код:

if not ISExec ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\Data.bin" -dp"{app}"'), ExpandConstant('{tmp}'), '...',False) then break;
if not ISExec ( 0, 0, 0, ExpandConstant('{tmp}\precomp.exe'), ExpandConstant('-r "{app}\Data.srp {app}\Data.pcf"'), ExpandConstant('{tmp}'), '...',False) then break;
if not ISExec ( 0, 0, 0, ExpandConstant('{tmp}\srep.exe'), ExpandConstant('-mem512b -d -s -r "{app}\Data.pcf {app}\Data.arc"'), ExpandConstant('{tmp}'), '...',False) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{app}\Data.arc'), ExpandConstant('{app}\data1'), '', true, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

Но вылазит ошибка на втором архиве... Хотя по идее должно работать.. Вообщем цель - распаковать .srep -> .pcf - в скрытом режиме а конечный архив .arc уже что б был виден в инсталляторе...

Буду очень признателен за помощь. Спасибо заранее .

audiofeel 07-10-2013 01:55 2229947

Alloc, попробуй сделать "проще", просто выбери нужный батник в папке "New folder" (названия батников говорят сами за себя) а файлы которые надо зжать перемести в папку - "packeddata" , на выходе получишь архив, который распаковывается немного быстрее (что то там про паралельную распаковку), а в скрипт всего лишь нужно добавить (или не убирать)
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
и раскоментировать вот это =
#define facompress
#define PrecompInside
#define SrepInside
==============================
ну и соответственно все что в папке "include" перенеси у себе в инклуд
----------------------------------------
вроде все
http://rghost.ru/49201767

Alloc 07-10-2013 02:10 2229948

audiofeel, большое спасибо, я попробую


Большое спасибо за помощь, все прекрасно работает. Этого я и добивался)
Еще подскажите пожалуйста, какими командами можно установить пароль для архива?

vint56 07-10-2013 09:40 2229997

Alloc
arc.exe a -ep1 -dses --dirs -s; -lc- -di -i2 -r "-hpvint56" -mprecomp+srep:l512+lzma:a1:mfbt4:d176m:fb128:mc1000:lc8 data.bin packeddata\*

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.bin'), ExpandConstant('{app}'), '', false, 'vint56', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

Alloc 07-10-2013 13:54 2230131

vint56, большое спасибо. А путь где располагается файл "arc.ini" обязательно указывать? Инсталлятор и без этого благополучно распаковывает архивы вроде.. объясните пожалуйста

еще хотел спросить, чем лучше упаковать - srep или srep64. У меня x64-х битная ОС.. Ни как потом не повлияет на пользователей с х32 ОС если я буду паковать с Srep64? И как указать в батнике, что бы архиватор использовал именно это версию srep'а?

Да, и за что отвечает параметр "d176m"?

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

vint56 07-10-2013 15:50 2230220

Alloc если не надо arc.ini
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.bin'), ExpandConstant('{app}'), '', false, 'vint56', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
Насчет arc.ini если ты будеш использовать внешние упаковшики где он находиться в папке include
если у тебя Oc 64 тогда лутше использовать srep64.exe просто переменуй в srep.exe можно будет использовать больше 4 гигов памяти насчет распаковки CLS-srep.dll распакует
за что отвечает параметр "d176m"? сколько памяти использовать при сжатий lzma но все ровно будет ограничения да если Oc 64 бита для этого нужна FreeArc-LZMA-x64.exe тогда можно будет использовать больше памяти d512 это 5 гигов для распаковки потребуется 512 мегов
ну в расчет брать если использовал cls фильтры они тоже приболяют память для распаковки в isdone
if not SrepInit(ExpandConstant('{app}'),256,0) then break; выделить 256 мегов для распаковки
if not PrecompInit(ExpandConstant('{app}'),128,PCFVer) then break; 128 мегов для распаковки
будет считаться если использовалься srep и lzma пример 256+512 = 768 потребуется памяти
прочитай справку по freearc или 7zip

Alloc 07-10-2013 16:01 2230227

vint56, огромное спасибо за помощь! Теперь все ясно

Alloc 07-10-2013 16:48 2230272

У меня еще вопросик созрел, надеюсь на вашу помощь)

Вообщем при упаковке файлов игры, место на жестком диске стремительно приближается к нулю по известной причине.. Скажите пожалуйста, как и что прописать в батнике, что бы временные файлы упаковщиков "precomp+srep+lzma" хранились в определенной папке?
Заранее спасибо!

vint56 07-10-2013 16:50 2230275

Alloc
arc.exe a -w.\ пример
-w.\ будет создавать файлы возле батника а не во временном каталоге

Alloc 07-10-2013 16:59 2230287

vint56, еще раз спасибо)

Alloc 08-10-2013 14:55 2230775

Помогите кому не трудно разобраться с набором команд для сжатия.. Я исользую следующий набор команд для сжатия:

Код:

arc.exe a -ep1 -dses --dirs -s; -lc- -di -i2 -r "-hpvint56" -mprecomp+srep:l512+lzma:a1:mfbt4:d176m:fb128:mc1000:lc8 data.bin packeddata\*
При установке игры, "Setup.tmp" потребляет целых 720 мб памяти.. можно как то снизить данный показатель при этом не потерять степень сжатия и скорость распаковки? Заранее спасибо

Mat_y 08-10-2013 15:23 2230793

Госопда!
А как можно сделать, чтобы установщик запоминал какие компоненты пользователь выбрал при прошлой установке? Т.е. если установщик запущен еще раз, то галочки на выбранных компонентах оставались.... только так, чтобы фаил uninstall не создавался... кто-то говорил, что это можно сделать в ini. Может кто подсказать?

Антон_Мураткин@vk 08-10-2013 16:59 2230846

Подскажите пожалуйста. Создал новую кнопку [(Button) далее] но она не реагирует, что бы на следующию страницу переходило как прописать чтобы она работала? Заранее благодарю

vint56 08-10-2013 17:24 2230862

Антон_Мураткин@vk
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
ButtonNext: TNewButton;

procedure ButtonNextClick(Sender: TObject);
begin
WizardForm.NextButton.OnClick(nil);
end;

procedure InitializeWizard();
begin
ButtonNext := TNewButton.Create(WizardForm);
with ButtonNext do
begin
Parent := WizardForm;
Left := ScaleX(56);
Top := ScaleY(325);
Width := ScaleX(75);
Height := ScaleY(25);
Caption := 'Далее';
OnClick := @ButtonNextClick;
end;
end;

Антон_Мураткин@vk 08-10-2013 18:56 2230910

vint56, А можно вот в этом скрипте вставить чтобы кнопки работали

[code]
Код:

{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  NewButton1: TNewButton;
  NewButton2: TNewButton;
  NewButton3: TNewButton;

procedure RedesignWizardForm;
begin
  with WizardForm.WelcomeLabel2 do
  begin
    Height := ScaleY(127);
  end;

  { NewButton1 }
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(312);
    Top := ScaleY(280);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Далее';
  end;

  { NewButton2 }
  NewButton2 := TNewButton.Create(WizardForm);
  with NewButton2 do
  begin
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(416);
    Top := ScaleY(280);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Отмена';
  end;

  { NewButton3 }
  NewButton3 := TNewButton.Create(WizardForm);
  with NewButton3 do
  begin
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(208);
    Top := ScaleY(280);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Назад';
  end;

  NewButton1.TabOrder := 2;
  NewButton2.TabOrder := 3;
  NewButton3.TabOrder := 4;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

Или кто нибудь помогите пожалуйста.

habib2302 08-10-2013 19:09 2230919

Доброе время суток. Мне когда то давали скрипт на удаление настроек/сохранок программ/игр http://forum.oszone.net/post-2165899.html#post2165899 и никакого сообщения нету на удаление

vint56 08-10-2013 19:43 2230933

Антон_Мураткин@vk

читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
ButtonNext: TNewButton;
ButtonBack: TNewButton;
ButtonCancel: TNewButton;


procedure ButtonNextClick(Sender: TObject);
begin
WizardForm.NextButton.OnClick(nil);
end;

procedure ButtonBacktClick(Sender: TObject);
begin
WizardForm.BackButton.OnClick(nil);
end;

procedure ButtonCanceltClick(Sender: TObject);
begin
WizardForm.CancelButton.OnClick(nil);
end;

procedure InitializeWizard();
begin
with WizardForm.WelcomeLabel2 do
begin
Height := ScaleY(127);
end;

ButtonNext := TNewButton.Create(WizardForm);
with ButtonNext do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(312);
Top := ScaleY(280);
Width := ScaleX(75);
Height := ScaleY(25);
Caption := 'Далее';
OnClick := @ButtonNextClick;
end;

ButtonCancel := TNewButton.Create(WizardForm);
with ButtonCancel do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(416);
Top := ScaleY(280);
Width := ScaleX(75);
Height := ScaleY(25);
Caption := 'Отмена';
OnClick := @ButtonCanceltClick;
end;

ButtonBack := TNewButton.Create(WizardForm);
with ButtonBack do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(208);
Top := ScaleY(280);
Width := ScaleX(75);
Height := ScaleY(25);
Caption := 'Назад';
OnClick := @ButtonBacktClick;
end;
end;


Все работает habib2302 а ты правильно указал путь сохранений
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usPostUninstall:
if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения') then
begin
if MsgBoxEx(0, 'Удалить сохранения игры находящиеся по адресу:' + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения'), 'Удаление сохранений', $00000004 or $00000020, 0, 0) = IDYES then
DelTree(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения', True, True, True);
end;
end;
end;

Антон_Мураткин@vk 08-10-2013 22:33 2231023

vint56, Благодарю! Но почему то только всё это на первой страницы находится. А мне надо что бы кнопки были так же как на стандартном сетапе (инсталяторе) Есть кнопки стандартные а мне надо же такие только ещё и в другом месте

Nordek 08-10-2013 23:07 2231042

habib2302, У меня валяются такие варианты
Вариант 1

Код:

[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if
CurUninstallStep=usDone then
begin
if
DirExists(ExpandConstant('{userdocs}\Game')) then
begin
if
MsgBox('Удалить сохраненные игры?',mbconfirmation, mb_yesno) = IDYES then
begin
DelTree(ExpandConstant('{userdocs}\Game'), True, True, True);
end;
end;
end;
end;

Вариант 2
Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\My\Game; ValueType: string; ValueName: PathGame; ValueData: {app}; Flags: uninsdeletekey

[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var ResultStr:String;
begin
if
CurUninstallStep=usPostUninstall then
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Chuvakstepan\Spider-man3', 'UnInstConfirm', ResultStr)
if DirExists(ExpandConstant('{userdocs}')+'\Game') then
if
MsgBox('Удалить сохраненные игры',mbconfirmation, mb_YesNo) = IDYES then
begin
if not
DelTree(ExpandConstant('{userdocs}')+'\Game', True, True, True)
then
MsgBox('Папка не удалена!' #13#13 'Папка не существует или задействована.', mbError, MB_OK);
end;
end;
end;



Цитата:

Цитата habib2302
никакого сообщения нету на удаление »

А ты на (ExpandConstant('{userdocs}\Game') обращал внимание, совпадает с расположением твоих сохранений?

Nordek 08-10-2013 23:30 2231052

Цитата:

Цитата Антон_Мураткин@vk
Но почему то только всё это на первой страницы »

Обрати внимание на Parent
У тебя сейчас
Код:

Parent := WizardForm.WelcomePage;
А ты хочешь наверное на основную форму перенести?
Тогда так
Код:

Parent := WizardForm;

vint56 08-10-2013 23:58 2231074

Антон_Мураткин@vk вот так
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
ButtonNext: TNewButton;
ButtonBack: TNewButton;
ButtonCancel: TNewButton;


procedure ButtonNextClick(Sender: TObject);
begin
WizardForm.NextButton.OnClick(nil);
end;

procedure ButtonBacktClick(Sender: TObject);
begin
WizardForm.BackButton.OnClick(nil);
end;

procedure ButtonCanceltClick(Sender: TObject);
begin
WizardForm.CancelButton.OnClick(nil);
end;

procedure InitializeWizard();
begin
with WizardForm.WelcomeLabel2 do
begin
Height := ScaleY(127);
end;

with WizardForm do
begin
ClientHeight := ScaleY(390);
end;

ButtonNext := TNewButton.Create(WizardForm);
with ButtonNext do
begin
Parent := WizardForm;
Left := ScaleX(317);
Top := ScaleY(359);
Width := ScaleX(80);
Height := ScaleY(23);
Caption := 'Далее';
OnClick := @ButtonNextClick;
end;

ButtonCancel := TNewButton.Create(WizardForm);
with ButtonCancel do
begin
Parent := WizardForm;
Left := ScaleX(407);
Top := ScaleY(359);
Width := ScaleX(80);
Height := ScaleY(23);
Caption := 'Отмена';
OnClick := @ButtonCanceltClick;
end;

ButtonBack := TNewButton.Create(WizardForm);
with ButtonBack do
begin
Parent := WizardForm;
Left := ScaleX(237);
Top := ScaleY(359);
Width := ScaleX(80);
Height := ScaleY(23);
Caption := 'Назад';
OnClick := @ButtonBacktClick;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ButtonBack.Show;
case CurPageID of
wpWelcome: begin
ButtonBack.Hide;
end;
end;
end;

habib2302 09-10-2013 12:31 2231271

Доброе время суток. Я использую скрипт для закрепеня ярлыков на панель быстрого запуска win 7. И имя ярлыка получается корявое

Mat_y 10-10-2013 11:44 2231891

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

Mat_y 10-10-2013 17:47 2232135

У меня еще один вопрос, а как прописать правило, чтобы при удалении программы в реестре ничего не трогалось.

El Sanchez 10-10-2013 17:54 2232139

Цитата:

Цитата Mat_y
А как можно сделать, чтобы установщик запоминал какие компоненты пользователь выбрал при прошлой установке? Т.е. если установщик запущен еще раз, то галочки на выбранных компонентах оставались.... только так, чтобы фаил uninstall не создавался... кто-то говорил, что это можно сделать в ini »

Mat_y, Способ 1 - Пользоваться параметрами командной строки /SAVEINF и /LOADINF, тогда установщик сделает все за вас, но приходится мириться с обязательным указанием этих параметров. Способ 2 - Хранить имена (не индексы) выбранных компонентов в конфигурационном файле (ini, xml) собственной структуры, тогда установщику все побоку и всю логику разбора конфига делать самому. Выбирайте.
Цитата:

Цитата Mat_y
Ребят, покажите, пожалуйста, где почитать как сделать чтобы выбранные компоненты подгружались в установщик из сети? »

Mat_y, это извращение.
Цитата:

Цитата habib2302
И имя ярлыка получается корявое »

habib2302, каково имя exe-файла, таково и имя ярлыка.

Mat_y 10-10-2013 18:43 2232193

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

Mat_y 10-10-2013 20:14 2232247

А по поводу реестра есть варианты?

El Sanchez 10-10-2013 22:36 2232309

Цитата:

Цитата Mat_y
но если один из компонентов весит Гиг, нужен он 10% людей »

Mat_y, не .NET Framework 4 часом? Инсталлятор - не качалка, требуемые для работы устанавливаемой им программы такие большие по размеру компоненты содержать/качать не обязан, обязан лишь определить наличие такого компонента в системе.
Цитата:

Цитата Mat_y
А по поводу реестра есть варианты? »

В теории перед удалением файлов на этапе usAppMutexCheck переименовать ветку регистрации деинсталлятора в реестре, на этапе usDone вернуть назад.

Mat_y 10-10-2013 23:40 2232336

Цитата:

Цитата El Sanchez
Mat_y, не .NET Framework 4 часом? »

Нет, не он. Знаю, что такая функция в Инно доступна, но вот почитать нигде не находил.

Цитата:

Цитата El Sanchez
В теории перед удалением файлов на этапе usAppMutexCheck переименовать ветку регистрации деинсталлятора в реестре, на этапе usDone вернуть назад. »

Я верю, что должен быть способ проще.


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

Gnom_aka_Lexander 11-10-2013 07:13 2232414

Цитата:

Цитата Mat_y
а вот можно ли выводить картинку, при наведении на компонент или еще какое действие? »

Можно.
Цитата:

Цитата Mat_y
и появится описание этого компонента... это я знаю как сделать »

Просто вместо надписи показывай картинку.
Цитата:

Цитата Mat_y
Я верю, что должен быть способ проще. »

И так проще некуда в 4 строчки делается.

Mat_y 11-10-2013 07:49 2232428

Цитата:

Цитата Gnom_aka_Lexander
И так проще некуда в 4 строчки делается. »

Судя по Вышей подписи, просить показать "как" бессмысленно?
Цитата:

Цитата Gnom_aka_Lexander
Просто вместо надписи показывай картинку. »

Боюсь уровень моих знаний скриптов не на том уровне.
Для инфо панели с текстом есть такой скрипт:
читать дальше »

Код:

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

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

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

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

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

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

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



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

Gnom_aka_Lexander 11-10-2013 08:46 2232456

Цитата:

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

Никак. Переделать можно, когда и вправду знаешь, как сделать. А использование сторонней библиотеки, которая делает за тебя не относится к ситуации
Цитата:

Цитата Mat_y
это я знаю как сделать »

держи простейший пример.
читать дальше »
Код:

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

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

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

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

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

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

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

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


Mat_y 11-10-2013 08:53 2232462

Цитата:

Цитата Gnom_aka_Lexander
держи простейший пример. »

Ну спасибо, ну выручили... ну теперь осталось его адаптировать под свои нужды.

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

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

Mat_y 11-10-2013 10:57 2232530

Цитата:

Цитата Gnom_aka_Lexander
держи простейший пример. »

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

1)
Строчка
Код:

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

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

И еще небольшой вопросик...
2) Как сделать, чтобы поле с картинкой изначально не было пустым и имело фоновую картинку, которая бы заменялась при наведении на компонент... для текстового поля это делается вот так...
Код:

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

El Sanchez 11-10-2013 10:59 2232532

Цитата:

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

Mat_y, я так понимаю патч какой-то делаете или что-то вроде того. Тут можно двумя путями пойти. Первый - это патч создает деинсталлятор и не регистрирует себя в ветке реестра AppId программы, тогда при удалении и файлы удалятся те, что надо, и реестровые записи сохранятся. Для этого всего лишь нужно в секции Setup директиву CreateUninstallRegKey установить в no. В апплете Установка и удаление программ патч, разумеется, не будет фигурировать. Второй - если очень хочется и через апплет удаление делать, то патч должен использовать свою ветку регистрации, не затрагивая программную.

Mat_y 11-10-2013 11:37 2232558

Цитата:

Цитата El Sanchez
CreateUninstallRegKey установить в no »

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

El Sanchez 11-10-2013 12:04 2232575

Цитата:

Цитата Mat_y
Если я поставлю CreateUninstallRegKey = no, то тогда же не будет запоминаться список установленных уже компонентов или будет? »

Mat_y, компонентов патча? Нет, не будет. Выбирайте второй метод, это обычная практика.

Mat_y 11-10-2013 12:36 2232606

Цитата:

Цитата El Sanchez
Выбирайте второй метод »

Я понимаю, что пользуюсь добротой, но не могли бы Вы помочь с созданием своей ветки регистрации, а то у меня не никак не получается.... может быть дело в том, что я использую AppId?

El Sanchez 11-10-2013 12:45 2232612

Цитата:

Цитата Mat_y
может быть дело в том, что я использую AppId? »

Mat_y, используйте отличный от AppId программы идентификатор для патча. Если AppId у программы это GUID ({...}-вида), то для патча сгенерите другой. Если AppId у программы, например, MyProgram, то для патча пишете, например, MyProgramPatch.

Mat_y 11-10-2013 13:35 2232646

Цитата:

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

Проблему решил, прописав правило:
Код:

if CurPageID=wpSelectComponents then

begin
    InitializeWizard5();
end;

Может кому пригодится.


Цитата:

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

Я совсем ламер в этих делах, Вы мне можете написать пример?

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

El Sanchez 11-10-2013 21:14 2232900

Цитата:

Цитата Mat_y
Я совсем ламер в этих делах, Вы мне можете написать пример? »

Пример в справке.
Цитата:

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

На примере предыдущего кода:
Код:

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


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


Mat_y 12-10-2013 11:30 2233071

Цитата:

Цитата El Sanchez
Пример в справке. »

Ну совсем не помогло... я думаю надо что-то писать в секцию [Registry]

Цитата:

Цитата El Sanchez
На примере предыдущего кода: »

А вот это спасибо, а вот это БОЛЬШОЕ спасибо!

Nordek 12-10-2013 12:54 2233113

Цитата:

Цитата Mat_y
Существует программа (не моя) и установщик находит к ней путь по AppId . »

Не известно какой установщик используется.
Цитата:

Цитата El Sanchez
используйте отличный от AppId программы идентификатор для патча. Если AppId у программы это GUID ({...}-вида) »

El Sanchez, Не учитываешь один момент с реестром.
У Inno может быть вида {XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}_is1 или MyProg_is1, а у других {XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}, MyProg или вообще XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. Не известно какой установщик используется у Mat_y, тем более как он указывает что не его:
Цитата:

Цитата El Sanchez
(не моя) »


El Sanchez 12-10-2013 16:51 2233214

Цитата:

Цитата Nordek
Не известно какой установщик используется у Mat_y, тем более как он указывает что не его »

Nordek, понятно, что это Inno, ибо сие...
Цитата:

Цитата Mat_y
Если воспользоваться Unninst.exe, то все дополненные файлы удаляются как надо, но и по AppId установщик эту программу перестает находить »

...возможно только в одном случае, когда патч имеет с программой одинаковый AppId (причем этот AppId именно Inno-шный, с приставкой _isцифра), при установке перезаписывает ветку регистрации программы, а при удалении благополучно ее сносит. Поэтому повторный запуск патча программу уже не найдет.
Цитата:

Цитата Mat_y
Ну совсем не помогло... я думаю надо что-то писать в секцию [Registry] »

Mat_y, не можете придумать отличный от AppId программы AppId патча? Тогда ветку регистрации программы из реестра, секцию Setup из скрипта патча и реализацию нахождения AppId программы в студию.

Alloc 12-10-2013 18:05 2233255

Всем приветы! Надеюсь на вашу помощь, а дело в следующем: инсталлятор не правильно показывает процентаж распаковки файлов, причем скрипт абсолютно чистый (не модифицированный). Архив всего один который был сжат Freearc'ом ([b]Наилучшее асимметричное (с быстрой распаковкой): -m9x -ld192m -s256m]/b])... Вообщем проценты доходят до 100% но распаковка все еще продолжается секунд 5-ть, в остальных же случаях, игры которые я так же паковал и использовал тот же скрипт распаковывались нормально... Пробовал как ручную расстановку процентных соотношений так и автоматическую с использованием records.inf, результат тот же.. в чем может быть причина?

Nordek 12-10-2013 21:47 2233384

Цитата:

Цитата Mat_y
но и по AppId установщик эту программу перестает находить »

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

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

#define AppName "My Program"
#define UnExe "{uninstallexe}"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
AppId=TheBestAppIdEverMade

[Code]
var
 
DeleteB: TNewButton;
  InstPath, UninsPath: string;
  ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure UninstallButton(Sender: TObject);
begin
 
Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;


procedure InitializeWizard;
begin
 
InstPath := 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|}'));
    begin
     
DeleteB := TNewButton.Create(WizardForm);
      DeleteB.Name := 'Del_Button';
      DeleteB.Parent := WizardForm;
      DeleteB.Left := ScaleX(163);
      DeleteB.Top := ScaleY(327);
      DeleteB.Width := ScaleX(75);
      DeleteB.Height := ScaleY(23);
      DeleteB.Caption := 'Удалить';
      DeleteB.OnClick := @UninstallButton;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1')
  then
    else
      begin
       
DeleteB.Visible := false;
      end;
end;


Mat_y 13-10-2013 11:40 2233570

AppId программы выглядит так:
Код:

[Setup]
AppId={{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}

Этот ключ я нашел в реестре для установленной программы в секции HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1

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

Nordek, что делает эта строчка?
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1')
  then
    else
      begin
        DeleteB.Visible := false;
      end;
end;

А конкретно эта:
Код:

        DeleteB.Visible := false;
Мне просто надо, чтобы деинсталлятор удалял файлы установленные, но реестр просто не трогал.

Raz3r 13-10-2013 13:28 2233616

[setup]
DefaultDirName="{code:MyConst}"
[code]
function MyConst(Default: String): String;
var
ResultStr: String;
begin
RegQueryStringValue(HKLM, 'Software\...', 'Install Dir', ResultStr);
Result:=ResultStr
end;

Вопрос: Как сделать, чтобы в случае отсутствия ссылки реестра инсталлятор автоматический указывал стандартный путь установки {pf}? Если кто знает помогите пожалуйста.

Nordek 13-10-2013 13:38 2233623

Цитата:

Цитата Mat_y
А конкретно эта: »

Делает кнопку удалить не активной если в системе не установлено приложение.
Цитата:

Цитата Mat_y
но реестр просто не трогал. »

Тот код выше который я тебе предоставил, он проверяет ветку реестра. А точнее InstallLocation и UninstallString, вот от них и пляши.

Могу предложить такой вариант
Код:

[Setup]
CreateUninstallRegKey=false
UninstallFilesDir={app}\Uninstall


Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: InstallLocation2; ValueData: {app}\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: UninstallString2; ValueData: """{app}\unins000.exe"""; Flags: uninsdeletevalue uninsdeletekeyifempty

т.е это для второго инсталлятора.


Тебе нужно чтоб при удалении не стиралась основная информации о инсталляции.
Значит используем во втором инсталляторе секцию [Registry] для того чтоб второй инсталлятор дописывал для кода информацию о удалении (о себе, что он там установлен).

Секцию "CreateUninstallRegKey=false" используем для того чтоб второй инсталлятор не вписывал о себе информацию и не заменял основную установку собой, для этого у второго есть секция [Registry] от куда дополняется информацией для кода InstallLocation2 и UninstallString2-ом.

"UninstallFilesDir={app}\Uninstall" служит для деинсталлятора, создаёт деинсталлятор в папке Uninstall

Таким образом, второй инсталлятор не трогает реестр т.е только дополняет. А при деинсталляции созданные им секции удаляет не затрагивая основную информацию первого.
А код, выполняет поиск. Существует ли второй компонент в системе или нет. (если что, в коде сам заменишь InstallLocation и UninstallString на InstallLocation 2 и UninstallString 2).

Вот примеры

Код:

[Setup]
AppId={{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}
AppName=Основная программа
AppVersion=1.5
;AppVerName=Основная программа 1.5
DefaultDirName={pf}\Программа
DefaultGroupName=Программа
OutputBaseFilename=setup1
OutputDir=.

[Icons]
Name: {group}\{cm:UninstallProgram,My Program 1}; Filename: {uninstallexe}


Код:

[Setup]
AppId={{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}
AppName=Компоненты к программе
AppVersion=1.5
;AppVerName=Компоненты к программе 1.5
DefaultDirName={pf}\Программа
DefaultGroupName=Программа
OutputBaseFilename=setup1
OutputDir=.
CreateUninstallRegKey=false
UninstallFilesDir={app}\Uninstall

[Icons]
Name: {group}\{cm:UninstallProgram,My Program 2}; Filename: {uninstallexe}

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: InstallLocation2; ValueData: {app}\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1; ValueType: string; ValueName: UninstallString2; ValueData: """{app}\unins000.exe"""; Flags: uninsdeletevalue uninsdeletekeyifempty



Надеюсь понял мою идею.

nik1967 13-10-2013 13:46 2233625

Raz3r,
пример
Код:

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={code:MyConst}

[_code]
function MyConst(Default: String): String;
var
ResultStr: String;
begin
  if RegQueryStringValue(HKLM, 'Software\...', 'Install Dir', ResultStr) then
    Result:= ResultStr
  else
    Result:= ExpandConstant('{pf}');
end;


Nordek 13-10-2013 14:01 2233633

Цитата:

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

Вот немного другой

пример 2

Код:

#define AppID "{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}"

[Setup]
AppId={{#AppID}
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("#AppID")}_is1,InstallLocation|{pf}\My Program}
DefaultGroupName=My Program
OutputDir=.


Raz3r 13-10-2013 14:27 2233643

nik1967, спасибо! Ты очень-очень помог!

Alloc 13-10-2013 15:17 2233673

Всем приветы! Надеюсь на вашу помощь, а дело в следующем: инсталлятор не правильно показывает процентаж распаковки файлов, причем скрипт абсолютно чистый (не модифицированный). Архив всего один который был сжат Freearc'ом ([b]Наилучшее асимметричное (с быстрой распаковкой): -m9x -ld192m -s256m]/b])... Вообщем проценты доходят до 100% но распаковка все еще продолжается секунд 5-ть, в остальных же случаях, игры которые я так же паковал и использовал тот же скрипт распаковывались нормально... Пробовал как ручную расстановку процентных соотношений так и автоматическую с использованием records.inf, результат тот же.. в чем может быть причина?

Raz3r 13-10-2013 15:18 2233675

Nordek спасибо за пример 2, я пожалуй оставлю первый уже.

Не хочу показаться слишком наглым, но у меня возникло ещё несколько вопросов по инсталлеру.

1. Какой командой переименовать разбитые тома, чтобы они имели своё название, отличающиеся от установщика?
2. Как сделать чтобы инсталлер можно было запускать в режиме автоустановки, т.е когда прописываешь команду запуска в батнике setup.exe -silenced инсталлер сразу начинает установку с отображением процесса?

Ещё раз извините что так много вопросов, просто я делаю качественный репак, а скриптованием занимаюсь только второй день. Заранее большое спасибо за ответы.

nik1967 13-10-2013 16:36 2233707

Raz3r,
1. На сколько я знаю - никакой. То, что в репаках (к примеру) - это архивы (например .arc), переименованные, так, как нужно и распаковываемые с помощью спец софта - например ISDone.
2. Советую поискать информацию по "тихой" установке. Это уже неоднократно обсуждалось.

Raz3r 13-10-2013 16:46 2233711

Цитата:

1. На сколько я знаю - никакой. То, что в репаках (к примеру) - это архивы (например .arc), переименованные, так, как нужно и распаковываемые с помощью спец софта - например ISDone.
2. Советую поискать информацию по "тихой" установке. Это уже неоднократно обсуждалось.
Спасибо за помощь ещй раз. Жаль переименовать нельзя никак(( А тему про тихую установку я уже нашел.

audiofeel 14-10-2013 08:04 2234044

Цитата:

Цитата Alloc
инсталлятор не правильно показывает процентаж распаковки файлов »

Нужен скрипт!!!!

Mat_y 14-10-2013 08:50 2234060

Цитата:

Цитата Nordek
Надеюсь понял мою идею. »

Идею понял... попробую.
Остался один вопрос... при таком вот исполнении, при повторном запуске инсталлятора он будет помнить список установленных компонентов?
UPD.
Поверил, все работает, дополняет реестр... только одна большая проблема...
при
Код:

CreateUninstallRegKey=no
Установщик не хочет запоминать список ранее установленных компонентов. Есть ли идеи как это обойти?

Mat_y 14-10-2013 10:05 2234087

Цитата:

Цитата El Sanchez
Цитата:

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

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

»

Блин... когда мышку убираю, то картинка становится на "нулевую", но когда перехожу со страницы с выбором директории на странице с компонентами, то изначально поле под картинку пустое.
UPD.
Ха, проблему решил старым добрым способом... но натолкнули на идею меня Вы. Спасибо.
читать дальше »
Код:

if CurPageID=wpSelectComponents then
begin
 InfoBMP.Show;
 InfoBMP.Bitmap := I_BMP[0];
 WizardForm.WizardSmallBitmapImage.Hide;
 WizardForm.PageNameLabel.Hide;
end;


Nordek 14-10-2013 11:04 2234114

Цитата:

Цитата Mat_y
при повторном запуске инсталлятора он будет помнить список установленных компонентов? »

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

Для компонентов
Inno Setup: Selected Components - Для отмеченных компонентов.
Inno Setup: Deselected Components - Для не отмеченных компонентов

Для задач
Inno Setup: Selected Tasks - Для отмеченных задач
Inno Setup: Deselected Tasks - Для не отмеченных задач

И Тип установки как Inno Setup: Setup Type.

Вторичный инсталлятор (Дополнительные компоненты например) имеет минус, он не будет помнить компоненты, задачи и тип установки т.к полностью не прописывает себя в реестр. При установке, прописывается только заданные значения InstallLocation2 и UninstallString2 для поиска на присутствие установленной вторичной программы через инсталлятор.
Но будет помнить какие компоненты ему нужно удалить не захватывая лишние (папки например, ярлыки, файлы) т.к прописываются они в unins000.dat.

Farser21 14-10-2013 13:47 2234218

Всем привет такой вопрос. У меня в установщике выбор компонентов (т.е. можно ставить галочки возле того что хочешь установить), но есть небольшая проблема. Все галочки сразу выставлены и немного не удобно постоянно убирать галочки и ставить что нужно. Как сделать чтобы изначально галочки не стояли.

Nordek 14-10-2013 14:18 2234228

Цитата:

Цитата Farser21
Все галочки сразу выставлены и немного не удобно постоянно убирать галочки »

Для задач можешь использовать Flags: unchecked.
Для компонентов смотри в сторону Types, там есть выбор custom, compact или full.
Например может присутствовать
Types: full, Types: compact или Types: custom. Удали строчку что касается Types.

Alloc 14-10-2013 15:29 2234273

audiofeel, Зачем скрипт, если я его не модифицировал вообще, он такой какой есть, единственное что я изменил так это вот:

Код:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\Data-2.bin'),  ExpandConstant('{app}'), '', false, '321989', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

vint56 14-10-2013 15:50 2234280

Alloc если один архив сделай так
if not ISArcExtract ( 0, 100, ExpandConstant('{src}\Data-2.bin'), ExpandConstant('{app}'), '', false, '321989', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

El Sanchez 14-10-2013 17:01 2234320

Nordek, Mat_y, месье знают толк в извращениях. Mat_y, вместо того, чтобы использовать для патча другой AppId дабы тот прописывался в своей ветке реестра и не трогал ветку основной программы, вы занимаетесь ерундой.
Цитата:

Цитата Mat_y
AppId программы выглядит так:
Код:
[Setup]
AppId={{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU} »

Вот и хорошо. Теперь сочиняете что-нибудь другое, например, {B7EB229F-2DFB-4612-AFC0-99773E1E14A8} или {C90E626C-6E7C-44A4-A8B3-77D584F4BCD8}, или {1EAC1D02-C6AC-4FA6-9A44-96258C37C812RUPATCH}, или WordOfTanksPatch, или еще около 10 млрд. примеров и пишете в AppId патча. Это значение будет использовано инсталлятором при регистрации самого себя в реестре, например, в ветке HKEY_LOCAL_MACHINE\SOFTWARE\...\Uninstall\{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}_is1, т.е. не в ветке основной программы. В свою ветку он пропишет и свои типы, компоненты, задачи и т.д. Пишете в скрипте патча:
Код:

[Setup]
AppId={{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}

Цитата:

Цитата Mat_y
Благодаря этому AppId мой установщик находит правильный путь к установленной программе. »

Мало только найти путь установленной программы, чтобы потом указать его на странице выбора папки установки, нужно еще и недопустить запуск патча при отсутствии установленной программы. Согласитесь, глупо устанавливать патч на программу, если ее нет. Пишете в скрипте патча:
Код:

[Setup]
AppId={{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU%7d_is1,InstallLocation|}

...
function InitializeSetup(): Boolean;
begin
   
Result := DirExists(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU%7d_is1,InstallLocation|}'));
    if not Result then MsgBox('Программа не найдена!', mbError, MB_OK);
end;

Цитата:

Цитата Mat_y
Но если я удаляю установленные сверху программы файлы (через Uninstall ), то удаляется и запись о программе в реестре (точнее она остается, но даже не открывается, выдавая ошибку). »

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

Nightwishh 14-10-2013 17:05 2234322

Всем здраствуйте. Объясните почему мирцают лейблы и др. объекты, которые находяться на картинке, при переходе с одной страницы на другую (причём видно задний фон этих объектов), продолжительностью доли секунды? Ботву неиспользую. И как с этим бороться? Надеюсь вопрос понятен :) Спасибо!!!

Mat_y 15-10-2013 16:33 2234940

Цитата:

Цитата El Sanchez
Nordek, Mat_y, месье знают толк в извращениях. »

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

Можете объяснить вот это место
Код:

%7d_is1
и вот это
Код:

InstallLocation
Цитата:

Цитата El Sanchez
Mat_y, не держите запущенный regedit на открытой ветке Uninstall (или ветке удаляемой программы) во время удаления программы, чтобы не пришлось потом удивляться присутствию фактически удаленной ветки. »

Вах! Телепат!

Shkutu 15-10-2013 17:13 2234961

Приветствую!
Возник вопрос, а можно ли использовать компоненты, но при этом не использовать типы установки? Просто столкнулась с тем, что даже если вообще не вводить секцию types, при установке все равно получается выбор типа установки (из тех стандартных, что у него есть: полный, выборочный, компактный)

El Sanchez 15-10-2013 21:01 2235100

Цитата:

Цитата Mat_y
%7d_is1 »

Mat_y, %7d - шестнадцатиричное представление символа }. Константа {reg} имеет следующий синтаксис: {reg:HKxx\SubkeyName,ValueName|DefaultValue}. SubkeyName может содержать в себе символы { и }, как в вашем случае, и , чтобы при парсинге константы эти символы воспринялись в литеральном смысле, а не как часть синтаксиса константы, нужно их экранировать. Открывающая скобка { экранируется собой же, закрывающая шестнадцатиричным представлением. Все это в справке есть, кстати.
Цитата:

Цитата Shkutu
Просто столкнулась с тем, что даже если вообще не вводить секцию types, при установке все равно получается выбор типа установки (из тех стандартных, что у него есть: полный, выборочный, компактный) »

Shkutu, пропишите только это:
Код:

[Types]
Name: custom; Description: Custom installation; Flags: iscustom


Mat_y 16-10-2013 09:10 2235306

Цитата:

Цитата El Sanchez
Мало только найти путь установленной программы, чтобы потом указать его на странице выбора папки установки, нужно еще и недопустить запуск патча при отсутствии установленной программы. Согласитесь, глупо устанавливать патч на программу, если ее нет. Пишете в скрипте патча:
читать дальше »
Код:

Код:
[Setup]
AppId={{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU%7d_is1,InstallLocation|}
...
function InitializeSetup(): Boolean;
begin
 Result := DirExists(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU%7d_is1,InstallLocation|}'));
 if not Result then MsgBox('Программа не найдена!', mbError, MB_OK);
end;

»

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

Но у меня появился к Вам еще вопрос.
Сейчас я проверяю правильность выбранной папки...
читать дальше »
Код:

///////////ПРОВЕРЯЕМ ПРАВИЛЬНОСТЬ ДИРЕКТОРИИ/////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result := True;

    case CurPageID of
        wpSelectDir:
        begin
            Result := FileExists(ExpandConstant('{app}')+'\GameName.exe');
            if not Result then MsgBoxEx(WizardForm.Handle, 'По данному пути игра не найдена! Еще раз проверьте путь установки!', 'Неверно указан путь к игре', MB_OK or MB_ICONWARNING, 0, 0);
        end;
    end;
  end;
////////////////////////////////////////////////////////////////////



Проверяемый фаил содержит в свойствах номер версии... можно ли как-то еще и версию фала проверять?

nik1967 16-10-2013 12:39 2235434

Цитата:

Цитата Mat_y
можно ли как-то еще и версию фала проверять? »

Можно
Код:

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
OutputDir=.
VersionInfoVersion=1.0.0.3

[ code]
function FileVersion(FilePath:string):string;              // версия файла
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFileVersion(FilePath);
end;

procedure InitializeWizard();
begin
  if FileExists(ExpandConstant('{src}\setup.exe')) then
    MsgBox(FileVersion(ExpandConstant('{src}\setup.exe')), mbInformation, MB_OK);
end;


Shkutu 16-10-2013 13:07 2235472

El Sanchez, спасибо!
А вот еще вопрос. Если в инсталляторе на странице выбора доп. задач есть чекбоксы для создания нескольких ярлыков на рабочем столе, то можно кроме них сделать чекбокс "выставить все" и, если можно, то как? Т е можно ли как-то программно выставлять чекбокс таска на странице wpSelectTasks?

nik1967 16-10-2013 13:43 2235498

Shkutu,
может так проще?
Код:

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Tasks]
Name: desktopicon; Description: Выставить все; GroupDescription: Создать ярлыки:
Name: desktopicon\di1; Description: 1 ярлык; Flags: unchecked
Name: desktopicon\di2; Description: 2 ярлык; Flags: unchecked
Name: desktopicon\di3; Description: 3 ярлык; Flags: unchecked


Shkutu 16-10-2013 14:36 2235525

nik1967, это не совсем то, насколько я поняла. GroupDescription просто позволяет объединить несколько задач в группу. В прошлый раз я наверное не совсем корректно задала вопрос. Смысл в том, что если, допустим, у меня есть 10 чек боксов для создания 10 ярлыков, то хотелось бы иметь еще 1 чек бокс "выставить все", после выставления которого остальные 10 автоматически станут выставлены (ну просто чтобы можно было кликнуть 1 раз вместо 10 :))
И еще вопрос. Можно ли на странице выбора компонентов эти самые компоненты разделить на группы, ну или выводить какой-нибудь текст между перечислением этих самых компонентов на странице wpSelectComponents. Т е как раз что-то вроде GroupDescription, но для компонентов?

nik1967 16-10-2013 14:42 2235528

Shkutu, а попробовать скомпилировать пример и посмотреть - не?
Цитата:

Цитата Shkutu
Смысл в том, что если, допустим, у меня есть 10 чек боксов для создания 10 ярлыков, то хотелось бы иметь еще 1 чек бокс "выставить все", после выставления которого остальные 10 автоматически станут выставлены (ну просто чтобы можно было кликнуть 1 раз вместо 10 ) »

Вот как раз это и происходит в данном примере, но без заморочек с секцией [ code]. А GroupDescription если не нужен, можно и не использовать.

Shkutu 16-10-2013 15:13 2235542

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

Mat_y 16-10-2013 17:24 2235600

Цитата:

Цитата nik1967
Можно
читать дальше »
Код:

Код:
[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
OutputDir=.
VersionInfoVersion=1.0.0.3
[ code]
function FileVersion(FilePath:string):string; // версия файла
var
 oFS: Variant;
begin
 oFS := CreateOleObject('Scripting.FileSystemObject');
 Result := oFS.GetFileVersion(FilePath);
end;
procedure InitializeWizard();
begin
 if FileExists(ExpandConstant('{src}\setup.exe')) then
 MsgBox(FileVersion(ExpandConstant('{src}\setup.exe')), mbInformation, MB_OK);
end; »


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

///////////ПРОВЕРЯЕМ ПРАВИЛЬНОСТЬ ДИРЕКТОРИИ/////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result := True;

    case CurPageID of
        wpSelectDir:
        begin
            Result := FileExists(ExpandConstant('{app}')+'\GameName.exe');
            if not Result then MsgBoxEx(WizardForm.Handle, 'По данному пути игра не найдена! Еще раз проверьте путь установки!', 'Неверно указан путь к игре', MB_OK or MB_ICONWARNING, 0, 0);
        end;
    end;
  end;
////////////////////////////////////////////////////////////////////


APTEM2 16-10-2013 23:36 2235792

Всем хай ребят выручайте что с этой ошибкой делать

nik1967 16-10-2013 23:53 2235805

APTEM2, удалить повторный идентификатор 'CancelBtn'
Mat_y, если не забуду, завтра пример набросаю.

APTEM2 17-10-2013 00:05 2235810

nik1967,
Ещё вопрос как в свой инстолятор добавить слайд шоу ?????????

Mat_y 17-10-2013 08:52 2235897

APTEM2, кнопка Cancel у Вас 2 раза прописана в коде.
Цитата:

Цитата APTEM2
Ещё вопрос как в свой инстолятор добавить слайд шоу ????????? »

Слайдшоу по процентам установки (из справки)
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
CreateAppDir=No
WindowVisible=Yes

[Files]
Source: innocallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: pic1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: pic2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: pic3.bmp; DestDir: {tmp}; Flags: dontcopy

[Code
type
TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);
var
BackgroundBitmapImage: TBitmapImage;
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';
function GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

procedure InitializeWizard();
begin
ExtractTemporaryFile('pic1.bmp')
ExtractTemporaryFile('pic2.bmp')
ExtractTemporaryFile('pic3.bmp')
end;

function PercentProgress(): Integer;
begin
with WizardForm.ProgressGauge do begin
Result:=(Position-Min)/((Max - Min)/100)
end
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
percent: integer;
begin
percent:=PercentProgress
with BackgroundBitmapImage do begin
if ((percent>0) and (percent<33) and (Tag<>1)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic1.bmp')
Tag:=1
end else
if ((percent>34) and (percent<66) and (Tag<>2)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic2.bmp')
Tag:=2
end else
if ((percent>67) and (percent<100) and (Tag<>3)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic3.bmp')
Tag:=3
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
Width, Height: Integer;
begin
If CurPageID=wpInstalling
then
begin
pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 500, pfunc)
BackgroundBitmapImage:=TBitmapImage.Create(MainForm)
with BackgroundBitmapImage do begin
BackColor:=clBlack
Center:=True
Align:=alClient
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\pic1.bmp')
Parent:=MainForm
Tag:=1
end
end
if CurPageID=wpFinished
then
begin
BackgroundBitmapImage.Hide
end
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID)
end;



Полноэкранный рисунок на фоновом окне и полноэкранное слайд-шоу по процентам (из справки):
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName=My Program
BackColor=0

[Files]
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: BackImage.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 3.bmp; DestDir: {tmp}; Flags: dontcopy

[Code
type
TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);
var
BackImage, SlideImage: TBitmapImage;
TimerID: LongWord;
s:string;
Width, Height:Integer;

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 GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

procedure InitializeWizard();
begin
WizardForm.Position:=poScreenCenter
Width:=GetSystemMetrics(0)
Height:=GetSystemMetrics(1)
MainForm.BORDERSTYLE:=bsNone
MainForm.Left:=0
MainForm.Top:=0
MainForm.Width:=Width
MainForm.Height:=Height
ExtractTemporaryFile('BackImage.bmp')
s:=ExpandConstant('{tmp}')+'\BackImage.bmp '
BackImage:=TBitmapImage.Create(MainForm)
BackImage.Bitmap.LoadFromFile(s)
BackImage.Align:=alClient
BackImage.Parent:=MainForm
BackImage.Stretch:=True
MainForm.Visible:=True

ExtractTemporaryFile('BackImage.bmp')
ExtractTemporaryFile('1.bmp')
ExtractTemporaryFile('2.bmp')
ExtractTemporaryFile('3.bmp')
end;

function PercentProgress(): Integer;
begin
with WizardForm.ProgressGauge do begin
Result:=(Position-Min)/((Max - Min)/100)
end
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
percent: integer;
begin
percent:=PercentProgress
with SlideImage do begin
if ((percent>0) and (percent<10) and (Tag<>1)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\1.bmp')
Tag:=1
end else
if ((percent>11) and (percent<20) and (Tag<>2)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\2.bmp')
Tag:=2
end else
if ((percent>21) and (percent<100) and (Tag<>3)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\3.bmp')
Tag:=3
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
Width, Height: Integer;
begin
If CurPageID=wpInstalling
then
begin
pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 500, pfunc)
SlideImage:=TBitmapImage.Create(MainForm)
with SlideImage do begin
Stretch:=True
Align:=alClient
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\1.bmp')
Parent:=MainForm
Tag:=1
end
end
if CurPageID=wpFinished
then
begin
SlideImage.Hide
end
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID)
end;



Inno Setup Faq. Слайд-шоу в окне инсталляции
читать дальше »
Код:

#define TIME_FOR_VIEW 10

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program

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

[Files]
Source: InnoCallback.dll; Flags: dontcopy noencryption nocompression solidbreak;
Source: .bmp; Flags: dontcopy noencryption nocompression solidbreak;

Source: D:\Games\StarCraft enGB\StarDat.mpq; DestDir: {app}

[Code
const
n=21; ///количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..N] 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_r andom_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} = N) then currTime:=0;
end;
end;

procedure InitializeWizard;
begin
bmp:=get_unique_random_number(N);
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 CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z:=2 to N do ExtractTemporaryFile('Image_ '+inttostr(bmp[z])+'.bmp');
end;
end;

procedure CurPageChanged(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.PageNameLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := True;
WizardForm.CancelButton.Top := WizardForm< /FONT> .Bevel.Top + ScaleY(100);
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.PageNameLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);
end;



nik1967, напоминаю о своей проблеме.

APTEM2 17-10-2013 13:40 2236007

Mat_y, nik1967,

Shkutu 17-10-2013 14:03 2236014

APTEM2, Вам же сказали, уберите|переименуйте 2й CancelBtn. На вашем же скриншоте видно в var ... NoIconsCheck, CancelBtn, MinBtn, CancelBtn
А на счет аналога GroupDescription для секции Components никто не знает?

APTEM2 17-10-2013 14:14 2236021

Shkutu,
Так а вот с этим что делать


Вот сам скрипт http://rghost.ru/49047898

Mat_y 17-10-2013 14:22 2236027

APTEM2,
Допишите в type
Код:

  Pchar =PansiChar;

Gnom_aka_Lexander 17-10-2013 14:24 2236029

Цитата:

Цитата Mat_y
Допишите в Var »

не в var а в type

habib2302 17-10-2013 22:36 2236276

доброе время суток.дайте мне пожалуйста скрипт на завершение работы процесса до установки и до удаления программы

Johny777 18-10-2013 01:36 2236378

habib2302,
Mat_y,

В шапку темы заглянуть не судьба?

"Определение информации о версии файла" , "Закрытие процесса"

Mat_y,
и чем тебя не устраивает метод GetFileVersion FileSystemObject-а, который предложил nik1967 ?
http://msdn.microsoft.com/en-us/libr...=vs.84%29.aspx
он как раз таки и возвращает версию файла в виде строки
и нет никакой нужды лезть в дебри WinApi
подправил функцию:
Код:

function FileVersion(const FilePath: String): String;
var
   
oFS: Variant;
begin
   
oFS := CreateOleObject('Scripting.FileSystemObject');
    try
       
Result := oFS.GetFileVersion(FilePath);
    except
    end
;
end;

просто сравнивай строки...

Mat_y 18-10-2013 08:55 2236432

Цитата:

Цитата Johny777
и чем тебя не устраивает метод GetFileVersion FileSystemObject-а, который предложил nik1967 »

Да Вы не поняли...сам метод меня полностью устраивает... я спросил "как дальше сравнить полученную версию файла с эталонной (допустим версия должна быть выше 2.0.0.1 и если версия ниже, то выдать окно с сообщением, что на данную версию продолжить установку нельзя).

Антон_Мураткин@vk 18-10-2013 10:06 2236466

Народ подскажите как с этим бороться?



Это происходит при удаления игры.

nik1967 18-10-2013 10:25 2236471

Mat_y,
держи
Код:

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.
DirExistsWarning=no

[code]
function FileVersion(const FilePath: String): String;
var
  oFS: Variant;
begin
  oFS:= CreateOleObject('Scripting.FileSystemObject');
    try
      Result:= oFS.GetFileVersion(FilePath);
    except
  end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result:= true;

    case CurPageID of
      wpSelectDir:
      begin
        if FileExists(ExpandConstant('{app}')+'\GameName.exe') then begin
          if FileVersion(ExpandConstant('{app}')+'\GameName.exe') < '2.0.0.1' then begin
            MsgBoxEx(WizardForm.Handle, 'На данную версию невозможно продолжить установку!', 'Не актуальная версия файла', MB_OK or MB_ICONWARNING, 0, 0);
            Result:= false;
          end;
        end else begin
          MsgBoxEx(WizardForm.Handle, 'По данному пути игра не найдена! Еще раз проверьте путь установки!', 'Неверно указан путь к игре', MB_OK or MB_ICONWARNING, 0, 0);
          Result:= false;
        end;
      end;
    end;
  end;


Johny777 18-10-2013 14:04 2236570

nik1967,

Цитата:

Цитата nik1967
) < '2.0.0.1' then »

так не получится (хотя было бы очень практично ! ), тк нужно сравнивать числа а не строку
Пардон я в прошлом говорил что нужно сравнивать стоки, но не знал что
Цитата:

Цитата Mat_y
допустим версия должна быть выше 2.0.0.1 и если версия ниже »

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

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

const
   
FILE_VERSION_STR_LEN = 7;
   
function CompareFileVersions(const AVer, BVer: String): Integer;
var
   
i: Integer;
begin
    for i := 1 to FILE_VERSION_STR_LEN do
    begin
        if
i and 1 = 0 then Continue; // если порядковый номер в строке чётный, то переходим к след. витку цикла, тк это точка

       
Result := Ord(AVer[i]) - Ord(BVer[i]);
        if Result <> 0 then Break;
    end;
end;


procedure InitializeWizard();
var
   
iResult: Integer;
begin
   
iResult := CompareFileVersions('7.0.0.1', '7.0.0.0');

    if iResult = 0 then MsgBox('Same Version', mbInformation, MB_OK)
    else
    if
iResult < 0 then MsgBox('AVer < BVer', mbInformation, MB_OK)
    else
    if
iResult > 0 then MsgBox('AVer > BVer', mbInformation, MB_OK);
end;



PS: делал упор на быстродействие :)

Shkutu 18-10-2013 14:32 2236591

Всем привет! Кто-нибудь знает, можно ли из инно запускать параметризованный sql скрипт (transact-sql) и как?

Alloc 18-10-2013 14:52 2236600

Помогите кому не трудно разобраться с набором команд для сжатия.. Я использую следующий набор команд:

Код:

arc.exe a -ep1 -dses --dirs -s; -lc- -di -i2 -r "-hppassword" -mprecomp+srep:l512+lzma:a1:mfbt4:d176m:fb128:mc1000:lc8 data.bin packeddata\*
При установке игры, "Setup.tmp" потребляет целых 720 мб оперативной памяти.. можно как то снизить данный показатель при этом не потерять степень сжатия и скорость распаковки? Заранее спасибо

nik1967 18-10-2013 14:53 2236602

Цитата:

Цитата Johny777
так не получится (хотя было бы очень практично ! ), тк нужно сравнивать числа а не строку »

Да ладно? Прежде чем выложить, я проверил и не раз. У меня почему то работает.
У тебя же function FileVersion возвращает строку - вот я и сравниваю строковый параметр - версию файла.

Johny777 18-10-2013 15:11 2236613

nik1967,
if '3.0.0.0' < '3.0.0.1' then Beep;
в натуре работает, буду знать, спасибо за знание! :)

даже не знал, что так можно, по старинке алгорим пишу... жесть, не задумывался о очевидном решении
те для меня сравнение строк раньше было =/<>, а можно оказывается и <, >

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

APTEM2 18-10-2013 22:21 2236852

Ребят Всем привет помогите решить проблему

Mat_y 19-10-2013 00:50 2236969

Ух... супер... все шикарно работает...
Немного адаптировал под себя... чтобы по 100 раз в код не лазить.
читать дальше »
Код:

function FileVersion(const FilePath: String): String;
var
  oFS: Variant;
begin
  oFS:= CreateOleObject('Scripting.FileSystemObject');
    try
      Result:= oFS.GetFileVersion(FilePath);
    except
  end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result:= true;

    case CurPageID of
      wpSelectDir:
      begin
        if FileExists(ExpandConstant('{app}')+'\Game.exe') then begin
          if  FileVersion(ExpandConstant('{app}')+'\Game.exe') < '{#AppVerName}.0' then begin
            MsgBoxEx(WizardForm.Handle, 'Установщик предназначен для версии {#AppVerName}', 'Файлы не подходят для данной версии', MB_OK or MB_ICONWARNING, 0, 0);
            Result:= false;
          end;
          if  FileVersion(ExpandConstant('{app}')+'\Game.exe') > '{#AppVerName}' then begin
            MsgBoxEx(WizardForm.Handle, 'Установщик предназначен для версии {#AppVerName}', 'Файлы не подходят для данной версии'', MB_OK or MB_ICONWARNING, 0, 0);
            Result:= false;
          end
      end else begin
          MsgBoxEx(WizardForm.Handle, 'Еще раз проверьте путь установки!', 'Неверно указан путь', MB_OK or MB_ICONWARNING, 0, 0);
          Result:= false;
        end;
      end;
    end;
  end;



И я опять возвращаюсь к наиболее запутанному для себя вопросу... реально ли подгружать особо крупные компоненты с ФТП, если их выберут для установки?

Nordek 19-10-2013 05:27 2237031

Цитата:

Цитата Mat_y
Немного адаптировал под себя... »

Только ошибку в скрипте допустил:

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

[Code]
function FileVersion(const FilePath: String): String;
var
 
oFS: Variant;
begin
 
oFS:= CreateOleObject('Scripting.FileSystemObject');
    try
     
Result:= oFS.GetFileVersion(FilePath);
    except
  end
;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
   
Result:= true;

    case CurPageID of
     
wpSelectDir:
      begin
        if
FileExists(ExpandConstant('{app}')+'\MyProg.exe') then begin
          if 
FileVersion(ExpandConstant('{app}')+'\MyProg.exe') < '{#AppVerName}.0' then begin
           
MsgBoxEx(WizardForm.Handle, 'Установщик предназначен для версии {#AppVerName}', 'Файлы не подходят для данной версии', MB_OK or MB_ICONWARNING, 0, 0);
            Result:= false;
          end;
          if  FileVersion(ExpandConstant('{app}')+'\MyProg.exe') > '{#AppVerName}' then begin
           
MsgBoxEx(WizardForm.Handle, 'Установщик предназначен для версии {#AppVerName}', 'Файлы не подходят для данной версии', MB_OK or MB_ICONWARNING, 0, 0);
            Result:= false;
          end
      end else begin
         
MsgBoxEx(WizardForm.Handle, 'Еще раз проверьте путь установки!', 'Неверно указан путь', MB_OK or MB_ICONWARNING, 0, 0);
          Result:= false;
        end;
      end;
    end;
  end;


habib2302 19-10-2013 16:49 2237319

Доброе время суток. Я делаю репак atomic alarm clock. Проблема в том, что не срабатывает скрипт на удаление др. версий приложения при старте. Оригинальная програ установлена. Кстати. Кто то мне давал скрип (архив под название 1) он не работает

saurn 19-10-2013 18:45 2237373

Цитата:

Цитата habib2302
Кстати. Кто то мне давал скрип (архив под название 1) он не работает »

Я давал. Он работает. День другой, ошибки все те же)
читать дальше »
Код:

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

[Languages]
;Путь к файлу сообщений русского языка
Name: Russian; MessagesFile: compiler:Languages\Russian.isl

;Путь к файлу сообщений английского языка
Name: English; MessagesFile: compiler:Default.isl

[CustomMessages]
;Сообщение для русского языка
Russian.MsgUnins=Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?

;Сообщение для английского языка
English.MsgUnins=Before installation it is necessary to remove the previous version of the app. Continue?

[Code]
function InitializeSetup(): Boolean;
begin
   
MsgBox(CustomMessage('MsgUnins'), mbError, MB_OK);
end;



Цитата:

Цитата habib2302
Проблема в том, что не срабатывает скрипт на удаление др. версий приложения при старте »

Возможно потому, что оригинальный установщик написан не на Inno (какой у этой программки оригинальный инстал я не знаю) и создает запись в реестре без иновского _is1.
Код:

Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));

habib2302 19-10-2013 19:16 2237392

saurn, оригинальный установщик написан на inno setup на версии 5.5.3
помоги с ошибкой в этом скрипте
Код:

[CustomMessages]
Russian.Msg2=Удалить настройки программы находящиеся по адресу:
English.Msg2=Delete the program settings are at:
Ukrainian.Msg2=Видалити налаштування програми знаходяться за адресою:
Russian.Msg3=Удаление настроек
English.Msg3=Removal options
Ukrainian.Msg3=Видалення налаштувань

[code ]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case CurUninstallStep of
        usPostUninstall:
        if DirExists(AddBackslash(ExpandConstant('{userappdata}')) + 'Atomic Alarm Clock 6') then
        begin
            if MsgBoxEx(0, (CustomMessage('Msg2') + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userappdata}')) + 'Atomic Alarm Clock 6')), (CustomMessage('Msg3'), $00000004 or $00000020, 0, 0) = IDYES then
            DelTree(AddBackslash(ExpandConstant('{userappdata}')) + 'Atomic Alarm Clock 6', True, True, True);
        end;
    end;
end;


saurn 19-10-2013 21:09 2237465

Цитата:

Цитата habib2302
помоги с ошибкой в этом скрипте »

Куча лишних скобок была.
Код:

[code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case CurUninstallStep of
        usPostUninstall:
        if DirExists(AddBackslash(ExpandConstant('{userappdata}')) + 'Atomic Alarm Clock 6') then
        begin
            if MsgBoxEx(0, CustomMessage('Msg2') + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userappdata}')) + 'Atomic Alarm Clock 6'), CustomMessage('Msg3'), $00000004 or $00000020, 0, 0) = IDYES then
            DelTree(AddBackslash(ExpandConstant('{userappdata}')) + 'Atomic Alarm Clock 6', True, True, True);
        end;
    end;
end;


habib2302 19-10-2013 21:58 2237504

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

saurn 19-10-2013 22:16 2237523

Цитата:

Цитата habib2302
как сделать так, чтобы процесс был завершен до удаления приложения?скрипт из шапки он завершает процесс до установки »

В оригинальном скрипте функция TerminateApp(...) вызывается в процедуре InitializeWizard, то есть в момент инициализации мастера установки. В вашем случае логичным будет вызывать ее, функцию, в момент инициализации удаления - в функции InitializeUninstall или в InitializeUninstallProgressForm.

habib2302 19-10-2013 22:25 2237528

скрипт на завершение процесса не работает и как решить проблему со скриптом на удаление др. версий приложения при старте.

Nordek 19-10-2013 23:11 2237548

Цитата:

Цитата habib2302
как сделать так, чтобы процесс был завершен до удаления приложения? »

Справка: Inno Setup Faq. На этапе деинсталляции убить процесс
Код:

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

[Code]
// функции используемые при деинсталляции
// RunTask@{app}\ISTask.dll - название функции (в данном случае, если программа работает)
// и путь dll'ки где она расположена...

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;


habib2302 20-10-2013 00:04 2237575

Nordek, тоже не работает

Nordek 20-10-2013 00:33 2237593

Цитата:

Цитата habib2302
тоже не работает »

Что значит не работает?
А в
Код:

  if RunTask('winamp.exe', False) then

Код:

          KillTask('winamp.exe');

вместо winamp.exe свой exe-шник прописывал (т.е завершаемый процесс)?

Учти, срабатывает после того как кликнешь деинсталлировать. Потом соглашаешься нажатием кнопки "Да" и только тогда выскочит диалог о завершении процесса.

habib2302 20-10-2013 00:49 2237607

Nordek, да вписывал
смотри

vint56 20-10-2013 11:30 2237701

habib2302 если ты компилируеш проэкт на unicode он работать не будет IsTask работает только в ansi версий

habib2302 20-10-2013 11:37 2237705

vint56, так у меня и стоит ansi

Nightwishh 20-10-2013 16:09 2237819

Здравствуйте. Прошу помощи. Есть функция "размер места на диске для выбранных компонентов"
Код:

function GetComponentSpace(): Currency;
var
  ComponentSpace, LabelSpace: string;
  StartLen, EndLen, SpaceLen: integer;
  begin
    ComponentSpace:= SetupMessage(msgComponentsDiskSpaceMBLabel);
    LabelSpace:= WizardForm.ComponentsDiskSpaceLabel.Caption;

    StartLen:= Pos('[mb]', ComponentSpace);
    SpaceLen:= Length(LabelSpace) - Length(ComponentSpace) + 4;
    ComponentSpace:= Copy(LabelSpace, StartLen, SpaceLen);

    Result:= StrToFloat(Trim(ComponentSpace));
end;

Как мне перенести "Текущий выбор требует не менее ??? Мб на диске" на лейбл. Пробовал так
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program

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

[Types]
Name: custom; Description: Выборочная; Flags: iscustom

[Components]
Name: a; Description: Моя программа; ExtraDiskSpaceRequired: 15000000; Types: custom
Name: aa; Description: Руководство пользователя; ExtraDiskSpaceRequired: 2655285235; Types: custom
Name: aaa; Description: Русский; ExtraDiskSpaceRequired: 5587282385; Types: custom

[ Code]
var
  SpaceComponentsLabel: TLabel;

function GetComponentSpace(): Currency;
var
ComponentSpace, LabelSpace: string;
StartLen, EndLen, SpaceLen: integer;
begin
ComponentSpace:= SetupMessage(msgComponentsDiskSpaceMBLabel);
LabelSpace:= SpaceComponentsLabel.Caption;

StartLen:= Pos('[mb]', ComponentSpace);
SpaceLen:= Length(LabelSpace) - Length(ComponentSpace) + 4;
ComponentSpace:= Copy(LabelSpace, StartLen, SpaceLen);

Result:= StrToFloat(Trim(ComponentSpace));
end;

procedure InitializeWizard();
begin
  WizardForm.ComponentsDiskSpaceLabel.Hide;

  SpaceComponentsLabel:= TLabel.Create(WizardForm);
  with SpaceComponentsLabel do
  begin
    Parent := WizardForm.SelectComponentsPage;
    AutoSize := False;
    Left := ScaleX(0);
    Top := ScaleY(216);
    Width := ScaleX(417);
    Height := ScaleY(14);
  end;
end;

ничего невыходит

saurn 21-10-2013 10:32 2238260

Nightwishh, немного измененный пример от Johny777

Измененный пример под ваши нужды
Код:

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


[Components]
Name: a; Description: Моя программа; ExtraDiskSpaceRequired: 15000000; Types: full custom;
Name: aa; Description: Руководство пользователя; ExtraDiskSpaceRequired: 2655285235; Types: custom
Name: aaa; Description: Русский; ExtraDiskSpaceRequired: 5587282385; Types: custom



[Code]
var
   
OldCompListOnClickCheckProc: TNotifyEvent;
    SpaceComponentsLabel: TLabel;
   

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;


procedure ComponentsListOnClickCheck(Sender: TObject);
begin
   
OldCompListOnClickCheckProc(TNewCheckListBox(Sender));
    SpaceComponentsLabel.Caption := 'Дополнительно требуется не менее' + #32 + GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption) + #32 + 'Мб';
end;


procedure InitializeWizard();
begin
   
WizardForm.ComponentsDiskSpaceLabel.Hide;
    OldCompListOnClickCheckProc := WizardForm.ComponentsList.OnClickCheck;
    WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;

    SpaceComponentsLabel:= TLabel.Create(nil);
    with SpaceComponentsLabel do
    begin
       
Parent := WizardForm.SelectComponentsPage;
        SetBounds(ScaleX(WizardForm.ComponentsDiskSpaceLabel.Left), ScaleY(WizardForm.ComponentsDiskSpaceLabel.Top), ScaleX(WizardForm.ComponentsDiskSpaceLabel.Width), ScaleY(WizardForm.ComponentsDiskSpaceLabel.Height));
        AutoSize := False;
        Font.Style := [fsBold];
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
CurPageID of
       
wpSelectComponents: ComponentsListOnClickCheck(WizardForm.ComponentsList);
    end;
end;


Оригинальный пост

-------------------------------------------------------------------------------------
Цитата:

Цитата habib2302
и как решить проблему со скриптом на удаление др. версий приложения при старте. »

Надо бы глянуть, что пишет приложение в реестр, в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Nightwishh 21-10-2013 22:57 2238666

saurn, Спасибо Вам за скрипт и за оригинал спасибо Johny777, но образовался вопрос. Можно ли сделать так чтобы числа не отражались вот так: 7876.5 Мб, а чтобы запись была в таком формате: 7 876.5 Мб, а то читать сложновато? :) Спасибо за внимание.

Dinvin4ester 21-10-2013 23:33 2238695

Ребята помогите!
Что надо прописать, чтобы по умолчанию напротив необходимого элемента стояла галочка (которую при необходимости можно было отключить). например, установка доп. ПО или русификатора?

Nordek 22-10-2013 06:04 2238781

Цитата:

Цитата Dinvin4ester
Что надо прописать, чтобы по умолчанию напротив необходимого элемента стояла галочка (которую при необходимости можно было отключить). »

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

[Components]
Name: a; Description: AAA; Types: full
Name: a; Description: AAA

Здесь обрати внимание на ; Types: full, если нужно чтоб выбиралось то вставь ; Types: full.
full - это полная установка.
custom - это выборочная установка
compact - это компактная установка.




Задачи
Код:

[Tasks]
Name: a; Description: A
Name: a; Description: A; Flags: unchecked

Обрати внимание на Flags: unchecked если нужно чтоб выбиралось, то убери Flags: unchecked.

Mat_y 22-10-2013 08:45 2238807

Господа! такой вопрос...

При повторном запуске программы установки и выборе другого компонента (допустим стоял 1 компонент, а хочу поставить 2-й компонент.... они помечены флагом: Flags: exclusive) появляется такое окошко...

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

[InstallDelete]
Type: filesandordirs; Name: {app}\{#AppVerName}

1) Я так понял, что [InstallDelete] срабатывает только при первичной установке компонентов, а потом игнорируется?
2) Как можно сделать, чтобы окошко (упомянутое вше) не выскакивало?

nik1967 22-10-2013 09:54 2238817

Цитата:

Цитата Mat_y
Как можно сделать, чтобы окошко (упомянутое вше) не выскакивало? »

Почитать справку
[Setup]: UsePreviousSetupType
Возможные значения:
yes или no
Значение по умолчанию:
yes

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

Если Uninstallable=no, эта директива имеет значение no.

saurn 22-10-2013 15:38 2238961

Цитата:

Цитата Nightwishh
Можно ли сделать так чтобы числа не отражались вот так: 7876.5 Мб, а чтобы запись была в таком формате: 7 876.5 Мб, а то читать сложновато? »

Чето я в прошлый раз заморочился, можно было сделать гораздо проще :)
Пример
Код:

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


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


[Components]
Name: a; Description: Моя программа; ExtraDiskSpaceRequired: 15000000; Types: full custom;
Name: aa; Description: Руководство пользователя; ExtraDiskSpaceRequired: 2655285235; Types: custom
Name: aaa; Description: Русский; ExtraDiskSpaceRequired: 5587282385; Types: custom


[Code]
var
   
OldCompListOnClickCheckProc: TNotifyEvent;
    SpaceComponentsLabel: TLabel;
   
   
procedure ComponentsListOnClickCheck(Sender: TObject);
begin
   
OldCompListOnClickCheckProc(TNewCheckListBox(Sender));
    SpaceComponentsLabel.Caption := WizardForm.ComponentsDiskSpaceLabel.Caption;
end;


procedure InitializeWizard();
begin
   
WizardForm.ComponentsDiskSpaceLabel.Hide;
    OldCompListOnClickCheckProc := WizardForm.ComponentsList.OnClickCheck;
    WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;

    SpaceComponentsLabel:= TLabel.Create(nil);
    with SpaceComponentsLabel do
    begin
       
Parent := WizardForm.SelectComponentsPage;
        SetBounds(ScaleX(WizardForm.ComponentsDiskSpaceLabel.Left), ScaleY(WizardForm.ComponentsDiskSpaceLabel.Top), ScaleX(WizardForm.ComponentsDiskSpaceLabel.Width), ScaleY(WizardForm.ComponentsDiskSpaceLabel.Height));
        AutoSize := False;
        Font.Style := [fsBold];
        Font.Color := $0000FF;
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
CurPageID of
       
wpSelectComponents: ComponentsListOnClickCheck(WizardForm.ComponentsList);
    end;
end;


Farser21 22-10-2013 17:09 2239005

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

Получается после установки содержимого через установщик в отдельную папку все норм удаляет только то что установилось. А вот когда устанавливаешь в папку с другими файлами то удаляет не только что установилось а все содержимое той папки.

Скрипт
читать дальше »

#include "botva2.iss"
#include "BASS_Module.iss"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Сборка модов
AppVerName=Сборка модов
AppVersion=0.8.9
DefaultDirName={pf}\World_of_Tanks
DefaultGroupName=Сборка модов
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=C:\Users\Farser\Desktop\1.bmp
WizardSmallImageFile=C:\Users\Farser\Desktop\2.bmp
SetupIconFile=C:\Users\Farser\Desktop\back.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1

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

[Components]
Name: g0; Description: Разное; Flags: dontinheritcheck
Name: g0\c55; Description: шкурки; Flags: dontinheritcheck


[Files]
Source: "C:\Users\Stan\Desktop\Шкурки\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c55
Source: BASS_Files\*; DestDir: {tmp}; Flags: dontcopy
Source: music.mp3; DestDir: {tmp}; Flags: dontcopy

[Icons]
Name: "{group}\{cm:UninstallProgram,World of Tanks}"; Filename: "{uninstallexe}"

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

[code]
const
Color = clblack;
procedure Formcolor();
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.ReadyMemo.ScrollBars:= ssNone
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
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.PageNameLabel.Font.Color:=clWhite;
end;

procedure InitializeWizard();
begin
Formcolor();
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');

BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
BASS_DeInit; //Освобождаем процесс
gdipShutdown
end;

Nightwishh 22-10-2013 17:49 2239022

saurn, Спасибо большое, вопросов больше нет :yahoo:

saurn 22-10-2013 17:54 2239025

Farser21, уберите из скрипта эти строчки:
Код:

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

или измените на:
Код:

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


Farser21 22-10-2013 19:54 2239096

saurn, спасибо большое твой совет помог.

И есть еще 1 небольшой вопрос, когда выбираешь куда устанавливать файлы потом открывается сам список того что хочешь установить. Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка?

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

saurn 22-10-2013 20:01 2239106

Farser21, если я правильно вас понял, то тут то, что вам нужно: http://forum.oszone.net/post-2169372-662.html

Цитата:

Цитата Mat_y
Как можно сделать, чтобы окошко (упомянутое вше) не выскакивало? »

Секция Components, флаг disablenouninstallwarning

Nordek 22-10-2013 20:53 2239143

Цитата:

Цитата Farser21
Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка? »

Недавно ж был пример.

Farser21 22-10-2013 23:39 2239236

saurn, В целом все понятно, но как мне соединить это со своим скриптом.

Скрипт
читать дальше »

#include "botva2.iss"
#include "BASS_Module.iss"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Сборка модов от Farser (Собери сам)
AppVerName=Сборка модов от Farser (Собери сам)
AppVersion=0.8.9
DefaultDirName={pf}\World_of_Tanks
DefaultGroupName=Сборка модов от Farser (Собери сам)
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=C:\Users\Farser\Desktop\1.bmp
WizardSmallImageFile=C:\Users\Farser\Desktop\2.bmp
SetupIconFile=C:\Users\Farser\Desktop\back.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1

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

[Components]
Name: g0; Description: Прицелы; Flags: dontinheritcheck
Name: g0\c1; Description: Анимированный прицел (Снайперский); Flags: exclusive
Name: g0\c2; Description: Белый прицел; Flags: exclusive
Name: g0\c3; Description: Прицел как у 40 тонн; Flags: exclusive
Name: g0\c4; Description: Прицел Кирилла Орешкина (Зеленый); Flags: exclusive
Name: g0\c5; Description: Прицел Кирилла Орешкина (Синий); Flags: exclusive
Name: g0\c6; Description: Сведение с Пробитием снаряда и Толщиной брони; Flags: exclusive
Name: g0\c7; Description: Снайперский прицел (Простой); Flags: exclusive
Name: g0\c8; Description: Снайперский прицел Warface; Flags: exclusive
Name: g0\c10; Description: Снайперский прицел Минималистический; Flags: exclusive
Name: g0; Description: Арт-Прицелы; Flags: dontinheritcheck
Name: g0\c11; Description: Анимированный Арт-прицел; Flags: exclusive
Name: g0\c14; Description: Арт-прицел (Белый); Flags: exclusive
Name: g0\c15; Description: Арт-прицел (Простой); Flags: exclusive
Name: g0\c16; Description: Необычный Арт-прицел; Flags: exclusive
Name: g0; Description: Панели повреждений; Flags: dontinheritcheck
Name: g0\c17; Description: Анимированная Дамаг панель; Flags: exclusive
Name: g0\c18; Description: Дамаг панель (Прозрачная); Flags: exclusive
Name: g0\c19; Description: Дамаг панель (Прозрачная) с таймером починки; Flags: exclusive
Name: g0\c20; Description: Дамаг панель (С новыми иконками модулей); Flags: exclusive
Name: g0\c21; Description: Дамаг панель Xbox; Flags: exclusive
Name: g0\c22; Description: Дамаг панель Бионик (Зеленый); Flags: exclusive
Name: g0\c23; Description: Дамаг панель Бионик (Черный); Flags: exclusive
Name: g0\c24; Description: Дамаг панель в стиле RPG; Flags: exclusive
Name: g0\c25; Description: Дамаг панель от zayaz; Flags: exclusive
Name: g0\c26; Description: Китайская дамаг панель; Flags: exclusive
Name: g0; Description: Дамаг индикаторы; Flags: dontinheritcheck
Name: g0\c27; Description: Дамаг индикатор; Flags: exclusive
Name: g0\c28; Description: Дамаг индикатор (Легкий); Flags: exclusive
Name: g0\c29; Description: Дамаг индикатор (Пуля); Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор Warface; Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор (Простой); Flags: exclusive
Name: g0; Description: Маркеры фокуса; Flags: dontinheritcheck
Name: g0\c31; Description: Маркер фокуса (Атакую) желтый; Flags: exclusive
Name: g0\c32; Description: Маркер фокуса (Атакую) зеленый; Flags: exclusive
Name: g0\c33; Description: Маркер фокуса (Атакую) красный; Flags: exclusive
Name: g0\c34; Description: Маркер фокуса (Атакую) синий; Flags: exclusive
Name: g0; Description: УГН (Углы Горизонтальной Наводки); Flags: dontinheritcheck
Name: g0\c35; Description: УГН для ПТ (Желтые); Flags: exclusive
Name: g0\c36; Description: УГН для ПТ в стиле zayaz; Flags: exclusive
Name: g0\c37; Description: УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта; Flags: exclusive
Name: g0\c38; Description: УГН для ПТ и Арты (Квадратные); Flags: exclusive
Name: g0\c39; Description: УГН для ПТ и Арты (Оранжевые); Flags: exclusive
Name: g0; Description: Иконки; Flags: dontinheritcheck
Name: g0\c41; Description: Иконки снарядов; Flags: dontinheritcheck
Name: g0; Description: Мини-карты; Flags: dontinheritcheck
Name: g0\c44; Description: Мини карта (Названия танков, луч, радиус обзора); Flags: exclusive
Name: g0\c44; Description: Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков); Flags: exclusive
Name: g0\c44; Description: Мини карта Мини карта (Направление стволом противника и арты); Flags: exclusive
Name: g0; Description: Часы; Flags: dontinheritcheck
Name: g0\c46; Description: Часы в бою; Flags: dontinheritcheck
Name: g0\c47; Description: Часы с датой в ангаре (Белые); Flags: dontinheritcheck
Name: g0\c48; Description: Часы с датой в бою; Flags: dontinheritcheck
Name: g0; Description: Шкурки; Flags: dontinheritcheck
Name: g0; Description: Разное; Flags: dontinheritcheck
Name: g0\c51; Description: Дебуг панель; Flags: dontinheritcheck
Name: g0\c52; Description: Души танков; Flags: dontinheritcheck
Name: g0\c53; Description: Души танков в виде Оленя; Flags: dontinheritcheck
Name: g0\c54; Description: Зум; Flags: dontinheritcheck
Name: g0\c55; Description: Убираем черноту в снайперском режиме; Flags: dontinheritcheck
Name: g0\c56; Description: Цветные пробития; Flags: dontinheritcheck

[Files]
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Анимированный прицел (Снайперский)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c1
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Белый прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c2
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Прицел как у 40 тонн\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c3
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c4
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Синий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c5
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Сведение с Пробитием снаряда и Толщиной брони\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c6
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Снайперский прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c7
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c8
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Минималистический\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Анимированный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c11
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Белый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c14
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c15
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Необычный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c16
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Анимированная Дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c17
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c18
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная) с таймером починки\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c19
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (С новыми иконками модулей)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c20
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Xbox\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c21
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c22
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Черный)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c23
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель в стиле RPG\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c24
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель от zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c25
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Китайская дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c26
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c27
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Легкий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c28
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Пуля)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c29
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c30
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) желтый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c31
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) зеленый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c32
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) красный\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c33
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) синий\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c34
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ (Желтые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c35
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ в стиле zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c36
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c37
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Квадратные)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c38
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Оранжевые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c39
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Иконки---\Иконки снарядов\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c41
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, радиус обзора)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Мини карты---\Мини карта (Направление стволом противника и арты)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Часы---\Часы в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c46
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Часы---\Часы с датой в ангаре (Белые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c47
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Часы---\Часы с датой в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c48
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Дебуг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c51
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Души танков\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c52
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Души танков в виде Оленя\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c53
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Зум\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c54
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Убираем черноту в снайперском режиме\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c55
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Цветные пробития\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c56
Source: BASS_Files\*; DestDir: {tmp}; Flags: dontcopy
Source: music.mp3; DestDir: {tmp}; Flags: dontcopy

[Icons]
Name: "{group}\{cm:UninstallProgram,World of Tanks}"; Filename: "{uninstallexe}"

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

[code]
const
Color = clblack;
procedure Formcolor();
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.ReadyMemo.ScrollBars:= ssNone
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
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.PageNameLabel.Font.Color:=clWhite;
end;

procedure InitializeWizard();
begin
Formcolor();
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');

BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
BASS_DeInit; //Освобождаем процесс
gdipShutdown
end;

saurn 23-10-2013 00:34 2239259

Цитата:

Цитата Farser21
В целом все понятно, но как мне соединить это со своим скриптом. »

У вас в скрипте слишком много компонентов. У меня попросту нет времени, чтобы прописать картинку каждому компоненту. Плюс ко всему нет ни имен картинок, ни сведений о том, какая к какому компоненту будет привязана. Объединить их не сложно. Под спойлером краткое описание, как все это проделать.
читать дальше »
Код:

[Files]
;Сюда добавляете нужные картинки
Source: Wasteland_Scanner_con.bmp; Flags: dontcopy nocompression


[code]
...............

procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
   
UndefPic: String;
begin
    if
Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case
TNewCheckListBox(Sender).ItemCaption[Index] of
       
//Здесь описываете какая картинка к какому компоненту будет привязана по принципу:
//Имя компонента - 'Half-Life 2': Имя картинки - UndefPic := 'Wasteland_Scanner_con.bmp';

// Тоесть, если компонент называется "Компонент 1", а картинка называется "Картинка 1.bmp" то строка будет выглядеть так:
//'Компонент 1': UndefPic := 'Картинка 1.bmp';

           
'Half-Life 2 Episode One': UndefPic := 'Strider_early2.bmp';
            'Half-Life 2 Episode Two': UndefPic := 'Cremator_poster.bmp';
            'Portal': UndefPic := 'Portal.bmp';
        else
            begin
               
LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
       
LastIndex := Index;
    end;
end;

......................................

//Соедините скрипт с примером по ссылке в моем посте, укажите компоненты и картинки, как описаны выше. В завершении
//добавьте в процедуру InitializeWizard вызов процедуры InitInfo(), отвечающей за пока картинок к компонентам.
//Вот так:

//procedure InitializeWizard();
//begin
//    InitInfo();
//end;


Farser21 23-10-2013 00:41 2239262

saurn, ок спасибо разберусь. Только в разделе code у меня есть еще другие скрипты как их соединить с этим. Просто в моем code уже присутствует procedure InitializeWizard(). Как добавить еще и этот с картинками?

Nordek 23-10-2013 00:42 2239263

Farser21, Пробуй:
читать дальше »
Код:

#include "botva2.iss"
#include "BASS_Module.iss"

#define Pic1 "Wasteland_Scanner_con"
#define Pic2 "Strider_early2"
#define Pic3 "Cremator_poster"
#define Pic4 "Portal"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Сборка модов от Farser (Собери сам)
AppVerName=Сборка модов от Farser (Собери сам)
AppVersion=0.8.9
DefaultDirName={pf}\World_of_Tanks
DefaultGroupName=Сборка модов от Farser (Собери сам)
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=C:\Users\Farser\Desktop\1.bmp
WizardSmallImageFile=C:\Users\Farser\Desktop\2.bmp
SetupIconFile=C:\Users\Farser\Desktop\back.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1



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

[Components]
Name: g0; Description: Прицелы; Flags: dontinheritcheck
Name: g0\c1; Description: Анимированный прицел (Снайперский); Flags: exclusive
Name: g0\c2; Description: Белый прицел; Flags: exclusive
Name: g0\c3; Description: Прицел как у 40 тонн; Flags: exclusive
Name: g0\c4; Description: Прицел Кирилла Орешкина (Зеленый); Flags: exclusive
Name: g0\c5; Description: Прицел Кирилла Орешкина (Синий); Flags: exclusive
Name: g0\c6; Description: Сведение с Пробитием снаряда и Толщиной брони; Flags: exclusive
Name: g0\c7; Description: Снайперский прицел (Простой); Flags: exclusive
Name: g0\c8; Description: Снайперский прицел Warface; Flags: exclusive
Name: g0\c10; Description: Снайперский прицел Минималистический; Flags: exclusive
Name: g0; Description: Арт-Прицелы; Flags: dontinheritcheck
Name: g0\c11; Description: Анимированный Арт-прицел; Flags: exclusive
Name: g0\c14; Description: Арт-прицел (Белый); Flags: exclusive
Name: g0\c15; Description: Арт-прицел (Простой); Flags: exclusive
Name: g0\c16; Description: Необычный Арт-прицел; Flags: exclusive
Name: g0; Description: Панели повреждений; Flags: dontinheritcheck
Name: g0\c17; Description: Анимированная Дамаг панель; Flags: exclusive
Name: g0\c18; Description: Дамаг панель (Прозрачная); Flags: exclusive
Name: g0\c19; Description: Дамаг панель (Прозрачная) с таймером починки; Flags: exclusive
Name: g0\c20; Description: Дамаг панель (С новыми иконками модулей); Flags: exclusive
Name: g0\c21; Description: Дамаг панель Xbox; Flags: exclusive
Name: g0\c22; Description: Дамаг панель Бионик (Зеленый); Flags: exclusive
Name: g0\c23; Description: Дамаг панель Бионик (Черный); Flags: exclusive
Name: g0\c24; Description: Дамаг панель в стиле RPG; Flags: exclusive
Name: g0\c25; Description: Дамаг панель от zayaz; Flags: exclusive
Name: g0\c26; Description: Китайская дамаг панель; Flags: exclusive
Name: g0; Description: Дамаг индикаторы; Flags: dontinheritcheck
Name: g0\c27; Description: Дамаг индикатор; Flags: exclusive
Name: g0\c28; Description: Дамаг индикатор (Легкий); Flags: exclusive
Name: g0\c29; Description: Дамаг индикатор (Пуля); Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор Warface; Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор (Простой); Flags: exclusive
Name: g0; Description: Маркеры фокуса; Flags: dontinheritcheck
Name: g0\c31; Description: Маркер фокуса (Атакую) желтый; Flags: exclusive
Name: g0\c32; Description: Маркер фокуса (Атакую) зеленый; Flags: exclusive
Name: g0\c33; Description: Маркер фокуса (Атакую) красный; Flags: exclusive
Name: g0\c34; Description: Маркер фокуса (Атакую) синий; Flags: exclusive
Name: g0; Description: УГН (Углы Горизонтальной Наводки); Flags: dontinheritcheck
Name: g0\c35; Description: УГН для ПТ (Желтые); Flags: exclusive
Name: g0\c36; Description: УГН для ПТ в стиле zayaz; Flags: exclusive
Name: g0\c37; Description: УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта; Flags: exclusive
Name: g0\c38; Description: УГН для ПТ и Арты (Квадратные); Flags: exclusive
Name: g0\c39; Description: УГН для ПТ и Арты (Оранжевые); Flags: exclusive
Name: g0; Description: Иконки; Flags: dontinheritcheck
Name: g0\c41; Description: Иконки снарядов; Flags: dontinheritcheck
Name: g0; Description: Мини-карты; Flags: dontinheritcheck
Name: g0\c44; Description: Мини карта (Названия танков, луч, радиус обзора); Flags: exclusive
Name: g0\c44; Description: Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков); Flags: exclusive
Name: g0\c44; Description: Мини карта Мини карта (Направление стволом противника и арты); Flags: exclusive
Name: g0; Description: Часы; Flags: dontinheritcheck
Name: g0\c46; Description: Часы в бою; Flags: dontinheritcheck
Name: g0\c47; Description: Часы с датой в ангаре (Белые); Flags: dontinheritcheck
Name: g0\c48; Description: Часы с датой в бою; Flags: dontinheritcheck
Name: g0; Description: Шкурки; Flags: dontinheritcheck
Name: g0; Description: Разное; Flags: dontinheritcheck
Name: g0\c51; Description: Дебуг панель; Flags: dontinheritcheck
Name: g0\c52; Description: Души танков; Flags: dontinheritcheck
Name: g0\c53; Description: Души танков в виде Оленя; Flags: dontinheritcheck
Name: g0\c54; Description: Зум; Flags: dontinheritcheck
Name: g0\c55; Description: Убираем черноту в снайперском режиме; Flags: dontinheritcheck
Name: g0\c56; Description: Цветные пробития; Flags: dontinheritcheck


#define Files
[Files]
#ifdef Files
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Анимированный прицел (Снайперский)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c1
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Белый прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c2
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Прицел как у 40 тонн\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c3
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c4
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Синий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c5
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Сведение с Пробитием снаряда и Толщиной брони\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c6
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Снайперский прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c7
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c8
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Минималистический\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Анимированный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c11
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Белый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c14
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c15
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Арт прицелы---\Необычный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c16
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Анимированная Дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c17
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c18
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная) с таймером починки\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c19
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (С новыми иконками модулей)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c20
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Xbox\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c21
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c22
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Черный)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c23
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель в стиле RPG\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c24
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель от zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c25
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Панели повреждений---\Китайская дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c26
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c27
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Легкий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c28
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Пуля)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c29
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c30
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) желтый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c31
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) зеленый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c32
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) красный\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c33
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) синий\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c34
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ (Желтые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c35
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ в стиле zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c36
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c37
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Квадратные)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c38
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Оранжевые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c39
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Иконки---\Иконки снарядов\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c41
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, радиус обзора)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Мини карты---\Мини карта (Направление стволом противника и арты)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Часы---\Часы в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c46
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Часы---\Часы с датой в ангаре (Белые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c47
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Часы---\Часы с датой в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c48
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Дебуг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c51
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Души танков\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c52
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Души танков в виде Оленя\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c53
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Зум\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c54
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Убираем черноту в снайперском режиме\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c55
Source: "C:\Users\Farser\Desktop\Сборка (Собери Сам)\---Разное---\Цветные пробития\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c56
#endif
Source: BASS_Files\*; DestDir: {tmp}; Flags: dontcopy
Source: music.mp3; DestDir: {tmp}; Flags: dontcopy
Source: {#Pic1}.bmp; Flags: dontcopy nocompression
Source: {#Pic2}.bmp; Flags: dontcopy nocompression
Source: {#Pic3}.bmp; Flags: dontcopy nocompression
Source: {#Pic4}.bmp; Flags: dontcopy nocompression

[Icons]
Name: "{group}\{cm:UninstallProgram,World of Tanks}"; Filename: "{uninstallexe}"

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

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

const
    UNDEF_INDEX = -777;
    ALPHA_BLEND_LEVEL = 128; // max=Byte=255

    WS_EX_LAYERED = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY = 1;
    LWA_ALPHA = 2;
    GWL_EXSTYLE = (-20);


Color = clblack;
procedure Formcolor();
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.ReadyMemo.ScrollBars:= ssNone
 WizardForm.TypesCombo.Color:=Color;
 WizardForm.WelcomeLabel1.Color:=Color;
 WizardForm.WelcomeLabel1.Font.Color:=clWhite;
 WizardForm.InfoBeforeClickLabel.Color:=Color;
 WizardForm.MainPanel.Color:=Color;
 WizardForm.PageNameLabel.Color:=Color;
 WizardForm.PageDescriptionLabel.Color:=Color;
 WizardForm.ReadyLabel.Color:=Color;
 WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
 WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
 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.PageNameLabel.Font.Color:=clWhite;
end;

var
    InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;


type
    COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with PicForm do
        begin
            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
        SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
    UndefPic: String;
begin
    if Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case TNewCheckListBox(Sender).ItemCaption[Index] of
            'Прицелы': UndefPic := '{#Pic1}.bmp';
            'Арт-Прицелы': UndefPic := '{#Pic2}.bmp';
            'Панели повреждений': UndefPic := '{#Pic3}.bmp';
            'Дамаг индикаторы': UndefPic := '{#Pic4}.bmp';
        else
            begin
                LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
        LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
    PicForm.Hide;
end;


procedure InitInfo();
begin
    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
        BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
            Parent := PicForm;
            AutoSize := True;
        end;
    end;
end;


procedure InitializeWizard();
begin
    Formcolor();
    InitInfo();

ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');

BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
 //Можно добавить в инсталл несколько песен
 //BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
 end;

procedure DeinitializeSetup();
begin
  BASS_DeInit; //Освобождаем процесс
  gdipShutdown
end;


Farser21 23-10-2013 01:02 2239275

Nordek, выдает ошибку


P.S. с первой ошибкой разобрался, но появилась 2 она ниже под спойлером

Nordek 23-10-2013 01:12 2239280

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

Код:

#define Pic1 "Здесь"
#define Pic2 "Здесь"
#define Pic3 "Здесь"
#define Pic4 "Здесь"

без расширения .bmp, только название.

И картинки должны быть в bmp формате.

Mat_y 23-10-2013 08:46 2239352

Цитата:

Цитата nik1967
Описание:
При значении директивы yes, в начале установки инсталлятор поищет в реестре, не была ли установлена данная программа на данном компьютере, и если так, будет использовать тип и компоненты предыдущей установки, которые выбрал пользователь в прошлый раз при установке, как по умолчанию. »

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

Цитата:

Цитата saurn
Секция Components, флаг disablenouninstallwarning »

А.. ну вот... все гениальное просто... огромное спасибо... эта ветка форума просто кладезь знаний.

Nordek 23-10-2013 08:47 2239353

Цитата:

Цитата Farser21
но появилась 2 »

У меня никаких ошибок не выдаёт :dont-know .

Mat_y,
читать дальше »
Цитата:

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

Код:

[InstallDelete]
Type: filesandordirs; Name: {app}\{#AppVerName}

»

Ещё вариант например в компоненты добавить

Код:

[Components]
Name: delinst; Description: Удалять перед установкой

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

т.е чтоб из компонентов управлять удалением.

saurn 23-10-2013 09:44 2239370

Цитата:

Цитата Farser21
с первой ошибкой разобрался, но появилась 2 она ниже под спойлером »

Установите расширенную версию Inno Setup от Restools. Стандартная версия не знает тип TItemArea.

Farser21 23-10-2013 12:54 2239489

saurn, Спасибо вроде норм, только вот я установил Inno Setup от Restools
И теперь выдает такую ошибку

Mat_y 23-10-2013 13:01 2239493

Маленький вопросик....
На странице выбора директории я добавил место для галки создания резервной копии...
читать дальше »
Код:

///////////////////Добавляем кнопки - Резервная копия////////////////////////////
begin
  RedesignWizardForm;
MyTask:=TCheckBox.Create(WizardForm);
with MyTask do
begin
Parent:=WizardForm.SelectDirPage;
Caption:='Я хочу создать резервную копию';
Left:=ScaleX(0);
Top:=ScaleY(180);
Width:=ScaleX(400);
Height:=ScaleY(15);
TabOrder:=0;
Checked:=False;
///////////////////Добавляем кнопки - Резервная копия КОНЕЦ////////////////////////////



Как сделать так, чтобы при повторном запуске установщика, если уже была произведена установка ранее, эта секция не отображалась?
...

Nordek 23-10-2013 13:49 2239520

Цитата:

Цитата Farser21
И теперь выдает такую ошибку »

От сюда качал?

А зачем ты установил Inno Setup версии 5.5.4? На неё ещё нет расширенной.

Качай Inno Setup 5.5.1
isetup-5.5.1.exe или ispack-5.5.1-unicode.exe и только тогда на неё накатывай
Расширенную
Inno Setup Compiler build 121216
Inno ISCmplr Setup build 121002
по инструкции в первом посте соседней темы.

Farser21 23-10-2013 13:51 2239522

Nordek , да от туда качал. Сейчас сделаю как ты написал. Спасибо)

Nordek и saurn
Спасибо большое за ваши советы все работает)

Farser21 23-10-2013 14:30 2239544

И еще возможно как-то указать регулировать прозрачность картинки которая появляется когда наводишь на файл?

Nordek 23-10-2013 16:07 2239603

Цитата:

Цитата Farser21
как-то указать регулировать прозрачность картинки »

Код:

const
    ALPHA_BLEND_LEVEL = 128; // max=Byte=255


Farser21 23-10-2013 16:35 2239619

Nordek , спасибо огромное)

nik1967 23-10-2013 21:51 2239839

Цитата:

Цитата Mat_y
Веселый Вы человек... я тут на форуме людей мучил вопросами как сделать, чтобы компоненты (уже установленные) запоминались и реестр не страдал, а Вы мне предлагаете просто поставить "NO"... »

А один фиг, если всплывает такое окно, значит инсталл читает данные из реестра, как ты не упирайся. Одну запись в реестре он по любому (если конечно не прописано Uninstallable=no) создаёт. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\имя проги или GUID_is1. Ну а так то да, я весёлый чел.

Mat_y 23-10-2013 22:06 2239857

Цитата:

Цитата nik1967
А один фиг »

Вот решение
флаг disablenouninstallwarning

Я апну мой следующий вопрос, а то он уполз без ответа.

nik1967 24-10-2013 07:30 2239986

Цитата:

Цитата Mat_y
Вот решение
флаг disablenouninstallwarning »

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

Mat_y 24-10-2013 08:52 2240019

Цитата:

Цитата nik1967
Это решение для одного компонента, а если компонентов сотня? К каждому приписывать этот флаг? Хотя, что я доказываю. »

1/ Вы частично правы... в Ваших словах есть логика... но есть ISTool, где можно выделить все компоненты и поставить галочку напротив нужного флажка... у меня более 70 компонентов.... потратил примерно минуту с учетом запуска ISTool и нажатия кнопки сохранить в конце...

2/ Ребят... я перефразирую свой насущный вопрос...

Есть ли правило, которое бы звучало так:
Код:

если
установка уже запускалась (или присутствует запись этого установщика в реестре)
то
не создавать TCheckBox
иначе
begin
  RedesignWizardForm;
MyTask:=TCheckBox.Create(WizardForm);
with MyTask do
begin
Parent:=WizardForm.SelectDirPage;
Caption:='Я хочу создать резервную копию';
Left:=ScaleX(0);
Top:=ScaleY(180);
Width:=ScaleX(400);
Height:=ScaleY(15);
TabOrder:=0;
Checked:=False;

3/ Ребят, из-за чего может возникать такая ошибка?
Код:

Runtime Error:

Недопустимая строка с указанием класса, ProgID: "Scripting.FileSystemObject"


Nordek 24-10-2013 10:13 2240054

Mat_y, Можешь посмотреть в эту сторону:
читать дальше »
Код:

[Components]
Name: A; Description: Компонент; Types: full; Check: skipcmp

[Code]
function skipcmp:boolean;
begin
 
Result:=True;
begin
 If
RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 5_is1') then
 
Result:=False
end;
end;


Mat_y 24-10-2013 15:05 2240269

Цитата:

Цитата Nordek
Можешь посмотреть в эту сторону »

Что-то я никак не соображу, как бы это применить к моему случаю :(

El Sanchez 24-10-2013 17:35 2240392

Цитата:

Цитата Mat_y
Есть ли правило, которое бы звучало так: »

Mat_y, создать чекбокс, в свойстве Visible прописать:
Код:

Visible := not RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1');

Цитата:

Цитата Mat_y
из-за чего может возникать такая ошибка? »

Mat_y, означает, что часть компонента WSH тю-тю из-за насильнических действий над системой. Объект FileSystemObject живет в scrrun.dll, ее и нужно перерегистрировать:
Код:

regsvr32 /u scrrun.dll
regsvr32 /s scrrun.dll

А размер файла можно получить не только с помощью объекта FileSystemObject, а и с помощью справки.

Mat_y 24-10-2013 19:09 2240470

Цитата:

Цитата El Sanchez
Mat_y, создать чекбокс, в свойстве Visible прописать: »

что-то не работает.... я правильно делаю:?
читать дальше »
Код:

///////////////////Добавляем кнопки - Резервная копия////////////////////////////
begin
  RedesignWizardForm;
MyTask:=TCheckBox.Create(WizardForm);
with MyTask do
begin
Parent:=WizardForm.SelectDirPage;
Caption:='Я хочу создать резервную копию';
Left:=ScaleX(0);
Top:=ScaleY(180);
Width:=ScaleX(400);
Height:=ScaleY(15);
TabOrder:=0;
Checked:=False;
Visible:= not RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1');
///////////////////Добавляем кнопки - Резервная копия КОНЕЦ////////////////////////////



Если ставлю просто Visible:= true, то само собой все скрывается навсегда :)

Цитата:

Цитата El Sanchez
Объект FileSystemObject живет в scrrun.dll, ее и нужно перерегистрировать »

Этот куда вписывать? Просто ошибка на чужом компьютере всплыла.

Цитата:

Цитата El Sanchez
А размер файла можно получить не только с помощью объекта FileSystemObject, а и с помощью справки. »

Не, у меня это для проверки версии файла...
читать дальше »
Код:

function FileVersion(const FilePath: String): String;
var
  oFS: Variant;
begin
  oFS:= CreateOleObject('Scripting.FileSystemObject');
    try
      Result:= oFS.GetFileVersion(FilePath);
    except
  end;
end;


El Sanchez 24-10-2013 20:21 2240515

Цитата:

Цитата Mat_y
что-то не работает.... я правильно делаю:? »

Mat_y, {#AppID}_is1 с раскрытием константы этот раздел в реестре точно присутствует?

Цитата:

Цитата Mat_y
Этот куда вписывать? Просто ошибка на чужом компьютере всплыла. »

Mat_y, cmd.exe

Цитата:

Цитата Mat_y
Не, у меня это для проверки версии файла... »

Mat_y, тьфу, ты, ступил :). Тогда GetVersionNumbers, GetVersionNumbersString, Flags - comparetimestamp.

Nordek 24-10-2013 20:34 2240527

Цитата:

Цитата Mat_y
что-то не работает.... я правильно делаю:? »

Пробуй пример

Код:

#define AppID "{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}"

[Setup]
AppId={{#AppID}
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
OutputDir=.

[Code]
var
 
MyButton: TNewButton;

procedure InitializeWizard();
begin
 
MyButton := TNewButton.Create(WizardForm);
  with MyButton do
  begin
   
Parent := WizardForm;
    Left := ScaleX(40);
    Top := ScaleY(328);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Visible := not RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1');
    Caption := 'Кнопка';
  end;
end;


Скомпилируй
Запусти инсталлятор
Проведи установку
Ещё раз запусти инсталлятор.
Скрылась кнопочка?

Dinvin4ester 24-10-2013 22:13 2240585

Ребята, помогите вставить музыку в инсталл - http://sendfile.su/886037.
А вот с этой - http://sendfile.su/886094 сделать музыку по умолчанию , а то при запуске и когда установка идет ее не выключить и разобраться - полная установка со всеми компонентами... , да и у меня не получается , выдает ошибку .
А это , то что мне подсказали ..
читать дальше »
Компоненты
Код:
[Components]
Name: a; Description: AAA; Types: full
Name: a; Description: AAA
Здесь обрати внимание на ; Types: full, если нужно чтоб выбиралось то вставь ; Types: full.
full - это полная установка.
custom - это выборочная установка
compact - это компактная установка.




Задачи
Код:
[Tasks]
Name: a; Description: A
Name: a; Description: A; Flags: unchecked
Обрати внимание на Flags: unchecked если нужно чтоб выбиралось, то убери Flags: unchecked.

Mat_y 25-10-2013 00:00 2240648

Цитата:

Цитата Nordek
Скомпилируй
Запусти инсталлятор
Проведи установку
Ещё раз запусти инсталлятор.
Скрылась кнопочка? »

ага... спряталась...

А вот галочка в моем скрипте не хочет прятаться... в чем может быть дело?

Nordek 25-10-2013 00:17 2240657

Цитата:

Цитата Mat_y
ага... спряталась... »

А теперь аналогичным способом пробуй со своим примером:

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

#define AppID "{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}"

[Setup]
AppId={{#AppID}
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
OutputDir=.

[Code]
var
 
MyTask: TNewCheckBox;

procedure InitializeWizard();
begin
 
MyTask := TNewCheckBox.Create(WizardForm);
  with MyTask do
  begin
   
Parent := WizardForm.SelectDirPage;
    Left := ScaleX(0); 
    Top := ScaleY(180); 
    Width := ScaleX(400);
    Height := ScaleY(15);
    Caption:='Я хочу создать резервную копию';
    TabOrder:=0;
    Checked:=False;
    Visible := not RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1');
  end;
end;


Mat_y 25-10-2013 07:54 2240725

Цитата:

Цитата Nordek
А теперь аналогичным способом пробуй со своим примером: »

Все... это первая стадия к безумию...
так все исчезает!
Но если добавляю это в свой код... не работает!
Видимо что-то, где-то не дает спрятаться :(

saurn 25-10-2013 10:38 2240774

Цитата:

Цитата Mat_y
Как сделать так, чтобы при повторном запуске установщика, если уже была произведена установка ранее, эта секция не отображалась? »

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

#define AppID "{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}"


[Setup]
AppId={#AppID}
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
OutputDir=.


[Code]
var
   
MyTask: TCheckBox;
   
   
function My_Task(): Boolean;
begin
   
Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + ExpandConstant('{#SetupSetting("AppID")}') + '_is1');

    if not Result then
    begin
       
MyTask := TCheckBox.Create(nil);
        with MyTask do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(180), ScaleX(400), ScaleY(15));
            Caption := 'Я хочу создать резервную копию';
            Checked := not Result;
        end;
    end;
end;


procedure InitializeWizard();
begin
   
My_Task();
end;



ну или покороче:
читать дальше »
Код:

#define AppID "{{B7EB229F-2DFB-4612-AFC0-99773E1E14A8}"


[Setup]
AppId={#AppID}
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
OutputDir=.


[Code]
var
   
MyTask: TCheckBox;
   
   
procedure InitializeWizard();
begin
    if not
RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + ExpandConstant('{#SetupSetting("AppID")}') + '_is1') then
    begin
       
MyTask := TCheckBox.Create(nil);
        with MyTask do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(180), ScaleX(400), ScaleY(15));
            Caption := 'Я хочу создать резервную копию';
            Checked := not RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + ExpandConstant('{#SetupSetting("AppID")}') + '_is1');
        end;
    end;
end;


Johny777 25-10-2013 19:09 2241078

saurn, позволю себе сделать несколько замечаний касательно кода
1. я привык после написания кода просматривать его на наличие возможностей его оптимизации с точки зрения времени выполнения и экономии памяти
нет смысла гонять RegKeyExists 2 раза, в ней несколько WinApi функций - как мин имум 3 : отрыть, прочитать, закрыть,
нет смысла создавать кнопку, немного теории
например чекбокс это класс, те объявление
var uCBox: TCheckBox; означает объявления указателя uCBox на экземпляр класса TCheckBox, те по адресу скрытому под uCBox
лежит экземпляр класса TCheckBox, который включает в себя методы и свойства
те например свойство Checked имеет за собой как минимум одну булев переменную, простейший пример реализации свойства http://www.delphibasics.ru/Property.php
а есть и другие свойства и методы и локальные методы и свойства в private и всё это занимает память, те речь идёт о экономии памяти.
При вызове метода Free; экземпляр класса по адресу uCBox разрушается и занимаемая им память освобождается
2. Если чекбокс не был создан, то при попытке прочитать значения свойства (отмечен (да/нет)) вылетит ошибка чтения адреса
чтение идёт:
указатель(uCBox)---->указатель(локальная переменная например fArea : LongInt; в примере по ссылке выше)---->значение размером SizeOf(Longint), тк fArea : LongInt;
которое лежит или "начинает лежать" по адресу в последнем указателе fArea
те LongInt = 32 битное число. 1 Byte = 8 Bit. ----> 4 * 8 = 32 => размер LongInt = 4 байта
, НО мы то чекбокс не создали и по адресу uCBox лежит мусор, если не ошибаюсь из "Кучи" - остатки других программ, а адреса fArea тем более нет
те след. вопросом Mat_y могло быть: "почему когда программа установлена вылетает ошибка при проверке отмечен он или нет"
те при динамичном создании компонентов неплохо бы делать простую проверку, а именно
при инициализации присваивать значение нулевого указателя nil http://www.delphibasics.ru/Nil.php
uCBox := nil
и потом проверять if uCBox <> nil (if Assigned(uCBox )) then if uCBox.Checked then ...
короче так:
читать дальше »
Код:

var
   
MyTask: TCheckBox;


procedure InitializeWizard();
var
   
Installed: Boolean;
begin
   
MyTask := nil;
    Installed := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + ExpandConstant('{#SetupSetting("AppID")}') + '_is1');
    if not Installed then
    begin
        // присваиваем значение указателя которое возвращает метод конструктора Create
       
MyTask := TCheckBox.Create(nil);
        with MyTask do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(180), ScaleX(400), ScaleY(15));
            Caption := 'Я хочу создать резервную копию';
            Checked := not Installed;
        end;
    end;
   
   
   
   
   
    if MyTask <> nil then if MyTask.Checked then Beep;
   
end;


Farser21 26-10-2013 00:47 2241241

Всем доброго времени суток. Подскажите пожалуйста как убрать это из моего установщика:



Скрипт:
читать дальше »

#include "botva2.iss"
#include "BASS_Module.iss"

#define Pic1 "Анимированный прицел (Снайперский)"
#define Pic2 "Белый прицел"
#define Pic3 "Прицел как у 40 тонн"
#define Pic4 "Прицел Кирилла Орешкина (Зеленый)"
#define Pic5 "Прицел Кирилла Орешкина (Синий)"
#define Pic6 "Сведение с Пробитием снаряда и Толщиной брони"
#define Pic7 "Снайперский прицел (Простой)"
#define Pic8 "Снайперский прицел Warface"
#define Pic9 "Снайперский прицел Минималистический"
#define Pic10 "Спайперский прицел ZX mini"
#define Pic11 "Анимированный Арт-прицел"
#define Pic12 "Арт-прицел (Белый)"
#define Pic13 "Арт-прицел (Простой)"
#define Pic14 "Необычный Арт-прицел"
#define Pic15 "Анимированная Дамаг панель"
#define Pic16 "Дамаг панель (Прозрачная) с таймером починки"
#define Pic17 "Дамаг панель (Прозрачная)"
#define Pic18 "Дамаг панель (С новыми иконками модулей)"
#define Pic19 "Дамаг панель Xbox"
#define Pic20 "Дамаг панель Бионик (Зеленый)"
#define Pic21 "Дамаг панель Бионик (Черный)"
#define Pic22 "Дамаг панель в стиле RPG"
#define Pic23 "Дамаг панель от zayaz"
#define Pic24 "Китайская дамаг панель"
#define Pic25 "Дамаг индикатор (Легкий)"
#define Pic26 "Дамаг индикатор (Простой)"
#define Pic27 "Дамаг индикатор (Пуля)"
#define Pic28 "Дамаг индикатор Warface"
#define Pic29 "Дамаг индикатор"
#define Pic30 "Маркер фокуса (Атакую) желтый"
#define Pic31 "Маркер фокуса (Атакую) зеленый"
#define Pic32 "Маркер фокуса (Атакую) красный"
#define Pic33 "Маркер фокуса (Атакую) синий"
#define Pic34 "УГН для ПТ (Желтые)"
#define Pic35 "УГН для ПТ в стиле zayaz"
#define Pic36 "УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта"
#define Pic37 "УГН для ПТ и Арты (Квадратные)"
#define Pic38 "УГН для ПТ и Арты (Оранжевые)"
#define Pic39 "Иконки снарядов"
#define Pic40 "Мини карта (Названия танков, луч, радиус обзора)"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Сборка модов от Farser (Собери сам)
AppVerName=Сборка модов от Farser (Собери сам)
AppVersion=0.8.9
DefaultDirName={pf}\World_of_Tanks
DefaultGroupName=Сборка модов от Farser (Собери сам)
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=Images\Внешний вид\1.bmp
WizardSmallImageFile=Images\Внешний вид\2.bmp
SetupIconFile=Images\Внешний вид\back.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1

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

[Components]
Name: g0; Description: Прицелы; Flags: collapsed dontinheritcheck
Name: g0\c1; Description: Анимированный прицел (Снайперский); Flags: exclusive
Name: g0\c2; Description: Белый прицел; Flags: exclusive
Name: g0\c3; Description: Прицел как у 40 тонн; Flags: exclusive
Name: g0\c4; Description: Прицел Кирилла Орешкина (Зеленый); Flags: exclusive
Name: g0\c5; Description: Прицел Кирилла Орешкина (Синий); Flags: exclusive
Name: g0\c6; Description: Сведение с Пробитием снаряда и Толщиной брони; Flags: exclusive
Name: g0\c7; Description: Снайперский прицел (Простой); Flags: exclusive
Name: g0\c8; Description: Снайперский прицел Warface; Flags: exclusive
Name: g0\c10; Description: Снайперский прицел Минималистический; Flags: exclusive
Name: g0\c8; Description: Снайперский прицел TAIPAN; Flags: exclusive
Name: g0\c10; Description: Прицел от Андрея Тареева; Flags: exclusive
Name: g0; Description: Арт-Прицелы; Flags: collapsed dontinheritcheck
Name: g0\c11; Description: Анимированный Арт-прицел; Flags: exclusive
Name: g0\c14; Description: Арт-прицел (Белый); Flags: exclusive
Name: g0\c15; Description: Арт-прицел (Простой); Flags: exclusive
Name: g0\c16; Description: Необычный Арт-прицел; Flags: exclusive
Name: g0; Description: Панели повреждений; Flags: collapsed dontinheritcheck
Name: g0\c17; Description: Анимированная Дамаг панель; Flags: exclusive
Name: g0\c18; Description: Дамаг панель (Прозрачная); Flags: exclusive
Name: g0\c19; Description: Дамаг панель (Прозрачная) с таймером починки; Flags: exclusive
Name: g0\c20; Description: Дамаг панель (С новыми иконками модулей); Flags: exclusive
Name: g0\c21; Description: Дамаг панель Xbox; Flags: exclusive
Name: g0\c22; Description: Дамаг панель Бионик (Зеленый); Flags: exclusive
Name: g0\c23; Description: Дамаг панель Бионик (Черный); Flags: exclusive
Name: g0\c24; Description: Дамаг панель в стиле RPG; Flags: exclusive
Name: g0\c25; Description: Дамаг панель от zayaz; Flags: exclusive
Name: g0\c26; Description: Китайская дамаг панель; Flags: exclusive
Name: g0; Description: Дамаг индикаторы; Flags: collapsed dontinheritcheck
Name: g0\c27; Description: Дамаг индикатор; Flags: exclusive
Name: g0\c28; Description: Дамаг индикатор (Легкий); Flags: exclusive
Name: g0\c29; Description: Дамаг индикатор (Пуля); Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор Warface; Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор (Простой); Flags: exclusive
Name: g0; Description: Маркеры фокуса; Flags: collapsed dontinheritcheck
Name: g0\c31; Description: Маркер фокуса (Атакую) желтый; Flags: exclusive
Name: g0\c32; Description: Маркер фокуса (Атакую) зеленый; Flags: exclusive
Name: g0\c33; Description: Маркер фокуса (Атакую) красный; Flags: exclusive
Name: g0\c34; Description: Маркер фокуса (Атакую) синий; Flags: exclusive
Name: g0; Description: УГН (Углы Горизонтальной Наводки); Flags: collapsed dontinheritcheck
Name: g0\c35; Description: УГН для ПТ (Желтые); Flags: exclusive
Name: g0\c36; Description: УГН для ПТ в стиле zayaz; Flags: exclusive
Name: g0\c37; Description: УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта; Flags: exclusive
Name: g0\c38; Description: УГН для ПТ и Арты (Квадратные); Flags: exclusive
Name: g0\c39; Description: УГН для ПТ и Арты (Оранжевые); Flags: exclusive
Name: g0; Description: Иконки; Flags: collapsed dontinheritcheck
Name: g0\c41; Description: Иконки снарядов; Flags: dontinheritcheck
Name: g0; Description: Мини-карты; Flags: collapsed dontinheritcheck
Name: g0\c44; Description: Мини карта (Названия танков, луч, радиус обзора); Flags: exclusive
Name: g0\c44; Description: Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков); Flags: exclusive
Name: g0\c44; Description: Мини карта Мини карта (Направление стволом противника и арты); Flags: exclusive
Name: g0; Description: Часы; Flags: collapsed dontinheritcheck
Name: g0\c46; Description: Часы в бою; Flags: dontinheritcheck
Name: g0\c47; Description: Часы с датой в ангаре (Белые); Flags: dontinheritcheck
Name: g0\c48; Description: Часы с датой в бою; Flags: dontinheritcheck
Name: g0; Description: Шкурки; Flags: dontinheritcheck
Name: g0; Description: Разное; Flags: collapsed dontinheritcheck
Name: g0\c51; Description: Дебуг панель; Flags: dontinheritcheck
Name: g0\c52; Description: Души танков; Flags: dontinheritcheck
Name: g0\c53; Description: Души танков в виде Оленя; Flags: dontinheritcheck
Name: g0\c54; Description: Зум; Flags: dontinheritcheck
Name: g0\c55; Description: Убираем черноту в снайперском режиме; Flags: dontinheritcheck
Name: g0\c56; Description: Цветные пробития; Flags: dontinheritcheck

#define Files
[Files]
#ifdef Files
Source: "Сборка (Собери Сам)\---Прицелы---\Анимированный прицел (Снайперский)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c1
Source: "Сборка (Собери Сам)\---Прицелы---\Белый прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c2
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел как у 40 тонн\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c3
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c4
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Синий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c5
Source: "Сборка (Собери Сам)\---Прицелы---\Сведение с Пробитием снаряда и Толщиной брони\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c6
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c7
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c8
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Минималистический\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел TAIPAN\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел от Андрея Тареева\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "Сборка (Собери Сам)\---Арт прицелы---\Анимированный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c11
Source: "Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Белый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c14
Source: "Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c15
Source: "Сборка (Собери Сам)\---Арт прицелы---\Необычный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c16
Source: "Сборка (Собери Сам)\---Панели повреждений---\Анимированная Дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c17
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c18
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная) с таймером починки\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c19
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (С новыми иконками модулей)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c20
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Xbox\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c21
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c22
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Черный)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c23
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель в стиле RPG\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c24
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель от zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c25
Source: "Сборка (Собери Сам)\---Панели повреждений---\Китайская дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c26
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c27
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Легкий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c28
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Пуля)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c29
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c30
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) желтый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c31
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) зеленый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c32
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) красный\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c33
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) синий\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c34
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ (Желтые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c35
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ в стиле zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c36
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c37
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Квадратные)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c38
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Оранжевые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c39
Source: "Сборка (Собери Сам)\---Иконки---\Иконки снарядов\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c41
Source: "Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, радиус обзора)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "Сборка (Собери Сам)\---Мини карты---\Мини карта (Направление стволом противника и арты)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "Сборка (Собери Сам)\---Часы---\Часы в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c46
Source: "Сборка (Собери Сам)\---Часы---\Часы с датой в ангаре (Белые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c47
Source: "Сборка (Собери Сам)\---Часы---\Часы с датой в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c48
Source: "Сборка (Собери Сам)\---Разное---\Дебуг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c51
Source: "Сборка (Собери Сам)\---Разное---\Души танков\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c52
Source: "Сборка (Собери Сам)\---Разное---\Души танков в виде Оленя\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c53
Source: "Сборка (Собери Сам)\---Разное---\Зум\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c54
Source: "Сборка (Собери Сам)\---Разное---\Убираем черноту в снайперском режиме\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c55
Source: "Сборка (Собери Сам)\---Разное---\Цветные пробития\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c56
#endif
Source: BASS_Files\*; DestDir: {tmp}; Flags: dontcopy
Source: C:\Users\Farser\Desktop\BASS_Files\music.mp3; DestDir: {tmp}; Flags: dontcopy
Source: Images\Содержимое\{#Pic1}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic2}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic3}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic4}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic5}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic6}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic7}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic8}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic9}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic10}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic11}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic12}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic13}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic14}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic15}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic16}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic17}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic18}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic19}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic20}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic21}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic22}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic23}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic24}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic25}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic26}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic27}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic28}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic29}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic30}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic31}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic32}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic33}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic34}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic35}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic36}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic37}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic38}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic39}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic40}.bmp; Flags: dontcopy nocompression


[Icons]
Name: "{group}\{cm:UninstallProgram,World of Tanks}"; Filename: "{uninstallexe}"

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

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

const
UNDEF_INDEX = -777;
ALPHA_BLEND_LEVEL = 230; // max=Byte=255

WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);


Color = clblack;
procedure Formcolor();
begin
WizardForm.Font.Color:=clWhite;
WizardForm.TypesCombo.TabStop := False;
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.ReadyMemo.ScrollBars:= ssNone
WizardForm.DirEdit.TabStop := False;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.GroupEdit.TabStop := False;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
WizardForm.ComponentsList.TreeViewStyle := True;
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.PageNameLabel.Font.Color:=clWhite;
end;

var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;


type
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
try
with PicForm do
begin
SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
Show;
end;
finally
SetFocus(WizardForm.Handle);
end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Анимированный прицел (Снайперский)': UndefPic := '{#Pic1}.bmp';
'Белый прицел': UndefPic := '{#Pic2}.bmp';
'Прицел как у 40 тонн': UndefPic := '{#Pic3}.bmp';
'Прицел Кирилла Орешкина (Зеленый)': UndefPic := '{#Pic4}.bmp';
'Прицел Кирилла Орешкина (Синий)': UndefPic := '{#Pic5}.bmp';
'Сведение с Пробитием снаряда и Толщиной брони': UndefPic := '{#Pic6}.bmp';
'Снайперский прицел (Простой)': UndefPic := '{#Pic7}.bmp';
'Снайперский прицел Warface': UndefPic := '{#Pic8}.bmp';
'Снайперский прицел Минималистический': UndefPic := '{#Pic9}.bmp';
'Спайперский прицел ZX mini': UndefPic := '{#Pic10}.bmp';
'Анимированный Арт-прицел': UndefPic := '{#Pic11}.bmp';
'Арт-прицел (Белый)': UndefPic := '{#Pic12}.bmp';
'Арт-прицел (Простой)': UndefPic := '{#Pic13}.bmp';
'Необычный Арт-прицел': UndefPic := '{#Pic14}.bmp';
'Анимированная Дамаг панель': UndefPic := '{#Pic15}.bmp';
'Дамаг панель (Прозрачная)': UndefPic := '{#Pic16}.bmp';
'Дамаг панель (Прозрачная) с таймером починки': UndefPic := '{#Pic17}.bmp';
'Дамаг панель (С новыми иконками модулей)': UndefPic := '{#Pic18}.bmp';
'Дамаг панель Xbox': UndefPic := '{#Pic19}.bmp';
'Дамаг панель Бионик (Зеленый)': UndefPic := '{#Pic20}.bmp';
'Дамаг панель Бионик (Черный)': UndefPic := '{#Pic21}.bmp';
'Дамаг панель в стиле RPG': UndefPic := '{#Pic22}.bmp';
'Дамаг панель от zayaz': UndefPic := '{#Pic23}.bmp';
'Китайская дамаг панель': UndefPic := '{#Pic24}.bmp';
'Дамаг индикатор (Легкий)': UndefPic := '{#Pic25}.bmp';
'Дамаг индикатор (Простой)': UndefPic := '{#Pic26}.bmp';
'Дамаг индикатор (Пуля)': UndefPic := '{#Pic27}.bmp';
'Дамаг индикатор Warface': UndefPic := '{#Pic28}.bmp';
'Дамаг индикатор': UndefPic := '{#Pic29}.bmp';
'Маркер фокуса (Атакую) желтый': UndefPic := '{#Pic30}.bmp';
'Маркер фокуса (Атакую) зеленый': UndefPic := '{#Pic31}.bmp';
'Маркер фокуса (Атакую) красный': UndefPic := '{#Pic32}.bmp';
'Маркер фокуса (Атакую) синий': UndefPic := '{#Pic33}.bmp';
'УГН для ПТ (Желтые)': UndefPic := '{#Pic34}.bmp';
'УГН для ПТ в стиле zayaz': UndefPic := '{#Pic35}.bmp';
'УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта': UndefPic := '{#Pic36}.bmp';
'УГН для ПТ и Арты (Квадратные)': UndefPic := '{#Pic37}.bmp';
'УГН для ПТ и Арты (Оранжевые)': UndefPic := '{#Pic38}.bmp';
'Иконки снарядов': UndefPic := '{#Pic39}.bmp';
'Мини карта (Названия танков, луч, радиус обзора)': UndefPic := '{#Pic40}.bmp';
else
begin
LastIndex := UNDEF_INDEX;
PicForm.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
PicForm.Hide;
end;


procedure InitInfo();
begin
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;
PicForm := TForm.Create(WizardForm)
with PicForm do
begin
BorderStyle := bsNone;
FormStyle := fsStayOnTop;
InfoPic := TBitmapImage.Create(PicForm)
with InfoPic do
begin
Parent := PicForm;
AutoSize := True;
end;
end;
end;





procedure InitializeWizard();
begin
Formcolor();
InitInfo();

ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');

BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
BASS_DeInit; //Освобождаем процесс
gdipShutdown
end;

Nordek 26-10-2013 07:49 2241278

Цитата:

Цитата Farser21
Подскажите пожалуйста как убрать это из моего установщика »

Код:

[Code]
procedure InitializeWizard();
begin
 
WizardForm.TypesCombo.Visible := False;
end;


Mat_y 26-10-2013 08:42 2241289

Приветствую.

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

begin
  with WizardForm do
  begin
    with ComponentsList do
    begin
      OnItemMouseMove := @ComponentsListItemMouseMove;
    end;
  end;


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

2/ Есть ли способ убить запущенный процесс (рабочую программу) при установке на нее? В справке нашел 2 варианта, но ни один не сработал...

saurn 26-10-2013 11:10 2241315

Цитата:

Цитата Mat_y
Есть ли способ убить запущенный процесс (рабочую программу) при установке на нее? В справке нашел 2 варианта, но ни один не сработал... »

В шапке есть пример. И несколько страниц назад было.

Farser21 26-10-2013 11:32 2241323

Nordek, спасибо.
И еще возник вопрос.
Когда я использую Flags: exclusive, то почему-то сразу флажки выставлены.
А когда я использую Flags: dontinheritcheck, то флажки не стоят.

Как сделать так чтобы изначально флажки не где не стояли. А то немного не удобно каждый раз самому их убирать.
Заранее спасибо.

saurn 26-10-2013 11:37 2241325

Цитата:

Цитата Farser21
Как сделать так чтобы изначально флажки не где не стояли. »

Цитата:

Цитата Nordek
Удали строчку что касается Types. »

Код:

[Components]
Name: a; Description: aaa; Types: custom


Farser21 26-10-2013 12:06 2241334

saurn, в том то и дело что такой строчки у меня нету.

Скрипт
читать дальше »

#include "botva2.iss"
#include "BASS_Module.iss"

#define Pic1 "Анимированный прицел (Снайперский)"
#define Pic2 "Белый прицел"
#define Pic3 "Прицел как у 40 тонн"
#define Pic4 "Прицел Кирилла Орешкина (Зеленый)"
#define Pic5 "Прицел Кирилла Орешкина (Синий)"
#define Pic6 "Сведение с Пробитием снаряда и Толщиной брони"
#define Pic7 "Снайперский прицел (Простой)"
#define Pic8 "Снайперский прицел Warface"
#define Pic9 "Снайперский прицел Минималистический"
#define Pic10 "Спайперский прицел ZX mini"
#define Pic11 "Анимированный Арт-прицел"
#define Pic12 "Арт-прицел (Белый)"
#define Pic13 "Арт-прицел (Простой)"
#define Pic14 "Необычный Арт-прицел"
#define Pic15 "Анимированная Дамаг панель"
#define Pic16 "Дамаг панель (Прозрачная) с таймером починки"
#define Pic17 "Дамаг панель (Прозрачная)"
#define Pic18 "Дамаг панель (С новыми иконками модулей)"
#define Pic19 "Дамаг панель Xbox"
#define Pic20 "Дамаг панель Бионик (Зеленый)"
#define Pic21 "Дамаг панель Бионик (Черный)"
#define Pic22 "Дамаг панель в стиле RPG"
#define Pic23 "Дамаг панель от zayaz"
#define Pic24 "Китайская дамаг панель"
#define Pic25 "Дамаг индикатор (Легкий)"
#define Pic26 "Дамаг индикатор (Простой)"
#define Pic27 "Дамаг индикатор (Пуля)"
#define Pic28 "Дамаг индикатор Warface"
#define Pic29 "Дамаг индикатор"
#define Pic30 "Маркер фокуса (Атакую) желтый"
#define Pic31 "Маркер фокуса (Атакую) зеленый"
#define Pic32 "Маркер фокуса (Атакую) красный"
#define Pic33 "Маркер фокуса (Атакую) синий"
#define Pic34 "УГН для ПТ (Желтые)"
#define Pic35 "УГН для ПТ в стиле zayaz"
#define Pic36 "УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта"
#define Pic37 "УГН для ПТ и Арты (Квадратные)"
#define Pic38 "УГН для ПТ и Арты (Оранжевые)"
#define Pic39 "Иконки снарядов"
#define Pic40 "Мини карта (Названия танков, луч, радиус обзора)"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Сборка модов от Farser (Собери сам)
AppVerName=Сборка модов от Farser (Собери сам)
AppVersion=0.8.9
DefaultDirName={pf}\World_of_Tanks
DefaultGroupName=Сборка модов от Farser (Собери сам)
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=Images\Внешний вид\1.bmp
WizardSmallImageFile=Images\Внешний вид\2.bmp
SetupIconFile=Images\Внешний вид\back.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1

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

[Components]
Name: g0; Description: Прицелы; Flags: collapsed dontinheritcheck
Name: g0\c1; Description: Анимированный прицел (Снайперский); Flags: exclusive
Name: g0\c2; Description: Белый прицел; Flags: exclusive
Name: g0\c3; Description: Прицел как у 40 тонн; Flags: exclusive
Name: g0\c4; Description: Прицел Кирилла Орешкина (Зеленый); Flags: exclusive
Name: g0\c5; Description: Прицел Кирилла Орешкина (Синий); Flags: exclusive
Name: g0\c6; Description: Сведение с Пробитием снаряда и Толщиной брони; Flags: exclusive
Name: g0\c7; Description: Снайперский прицел (Простой); Flags: exclusive
Name: g0\c8; Description: Снайперский прицел Warface; Flags: exclusive
Name: g0\c10; Description: Снайперский прицел Минималистический; Flags: exclusive
Name: g0\c8; Description: Снайперский прицел TAIPAN; Flags: exclusive
Name: g0\c10; Description: Прицел от Андрея Тареева; Flags: exclusive
Name: g0; Description: Арт-Прицелы; Flags: collapsed dontinheritcheck
Name: g0\c11; Description: Анимированный Арт-прицел; Flags: exclusive
Name: g0\c14; Description: Арт-прицел (Белый); Flags: exclusive
Name: g0\c15; Description: Арт-прицел (Простой); Flags: exclusive
Name: g0\c16; Description: Необычный Арт-прицел; Flags: exclusive
Name: g0; Description: Панели повреждений; Flags: collapsed dontinheritcheck
Name: g0\c17; Description: Анимированная Дамаг панель; Flags: exclusive
Name: g0\c18; Description: Дамаг панель (Прозрачная); Flags: exclusive
Name: g0\c19; Description: Дамаг панель (Прозрачная) с таймером починки; Flags: exclusive
Name: g0\c20; Description: Дамаг панель (С новыми иконками модулей); Flags: exclusive
Name: g0\c21; Description: Дамаг панель Xbox; Flags: exclusive
Name: g0\c22; Description: Дамаг панель Бионик (Зеленый); Flags: exclusive
Name: g0\c23; Description: Дамаг панель Бионик (Черный); Flags: exclusive
Name: g0\c24; Description: Дамаг панель в стиле RPG; Flags: exclusive
Name: g0\c25; Description: Дамаг панель от zayaz; Flags: exclusive
Name: g0\c26; Description: Китайская дамаг панель; Flags: exclusive
Name: g0; Description: Дамаг индикаторы; Flags: collapsed dontinheritcheck
Name: g0\c27; Description: Дамаг индикатор; Flags: exclusive
Name: g0\c28; Description: Дамаг индикатор (Легкий); Flags: exclusive
Name: g0\c29; Description: Дамаг индикатор (Пуля); Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор Warface; Flags: exclusive
Name: g0\c30; Description: Дамаг индикатор (Простой); Flags: exclusive
Name: g0; Description: Маркеры фокуса; Flags: collapsed dontinheritcheck
Name: g0\c31; Description: Маркер фокуса (Атакую) желтый; Flags: exclusive
Name: g0\c32; Description: Маркер фокуса (Атакую) зеленый; Flags: exclusive
Name: g0\c33; Description: Маркер фокуса (Атакую) красный; Flags: exclusive
Name: g0\c34; Description: Маркер фокуса (Атакую) синий; Flags: exclusive
Name: g0; Description: УГН (Углы Горизонтальной Наводки); Flags: collapsed dontinheritcheck
Name: g0\c35; Description: УГН для ПТ (Желтые); Flags: exclusive
Name: g0\c36; Description: УГН для ПТ в стиле zayaz; Flags: exclusive
Name: g0\c37; Description: УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта; Flags: exclusive
Name: g0\c38; Description: УГН для ПТ и Арты (Квадратные); Flags: exclusive
Name: g0\c39; Description: УГН для ПТ и Арты (Оранжевые); Flags: exclusive
Name: g0; Description: Иконки; Flags: collapsed dontinheritcheck
Name: g0\c41; Description: Иконки снарядов; Flags: dontinheritcheck
Name: g0; Description: Мини-карты; Flags: collapsed dontinheritcheck
Name: g0\c44; Description: Мини карта (Названия танков, луч, радиус обзора); Flags: exclusive
Name: g0\c44; Description: Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков); Flags: exclusive
Name: g0\c44; Description: Мини карта Мини карта (Направление стволом противника и арты); Flags: exclusive
Name: g0; Description: Часы; Flags: collapsed dontinheritcheck
Name: g0\c46; Description: Часы в бою; Flags: dontinheritcheck
Name: g0\c47; Description: Часы с датой в ангаре (Белые); Flags: dontinheritcheck
Name: g0\c48; Description: Часы с датой в бою; Flags: dontinheritcheck
Name: g0; Description: Шкурки; Flags: dontinheritcheck
Name: g0; Description: Разное; Flags: collapsed dontinheritcheck
Name: g0\c51; Description: Дебуг панель; Flags: dontinheritcheck
Name: g0\c52; Description: Души танков; Flags: dontinheritcheck
Name: g0\c53; Description: Души танков в виде Оленя; Flags: dontinheritcheck
Name: g0\c54; Description: Зум; Flags: dontinheritcheck
Name: g0\c55; Description: Убираем черноту в снайперском режиме; Flags: dontinheritcheck
Name: g0\c56; Description: Цветные пробития; Flags: dontinheritcheck

#define Files
[Files]
#ifdef Files
Source: "Сборка (Собери Сам)\---Прицелы---\Анимированный прицел (Снайперский)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c1
Source: "Сборка (Собери Сам)\---Прицелы---\Белый прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c2
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел как у 40 тонн\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c3
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c4
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел Кирилла Орешкина (Синий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c5
Source: "Сборка (Собери Сам)\---Прицелы---\Сведение с Пробитием снаряда и Толщиной брони\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c6
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c7
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c8
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел Минималистический\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "Сборка (Собери Сам)\---Прицелы---\Снайперский прицел TAIPAN\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "Сборка (Собери Сам)\---Прицелы---\Прицел от Андрея Тареева\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c10
Source: "Сборка (Собери Сам)\---Арт прицелы---\Анимированный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c11
Source: "Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Белый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c14
Source: "Сборка (Собери Сам)\---Арт прицелы---\Арт-прицел (Простой)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c15
Source: "Сборка (Собери Сам)\---Арт прицелы---\Необычный Арт-прицел\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c16
Source: "Сборка (Собери Сам)\---Панели повреждений---\Анимированная Дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c17
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c18
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (Прозрачная) с таймером починки\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c19
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель (С новыми иконками модулей)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c20
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Xbox\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c21
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Зеленый)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c22
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель Бионик (Черный)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c23
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель в стиле RPG\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c24
Source: "Сборка (Собери Сам)\---Панели повреждений---\Дамаг панель от zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c25
Source: "Сборка (Собери Сам)\---Панели повреждений---\Китайская дамаг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c26
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c27
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Легкий)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c28
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор (Пуля)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c29
Source: "Сборка (Собери Сам)\---Дамаг индикаторы---\Дамаг индикатор Warface\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c30
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) желтый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c31
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) зеленый\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c32
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) красный\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c33
Source: "Сборка (Собери Сам)\---Маркеры фокуса---\Маркер фокуса (Атакую) синий\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c34
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ (Желтые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c35
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ в стиле zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c36
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c37
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Квадратные)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c38
Source: "Сборка (Собери Сам)\---УГН---\УГН для ПТ и Арты (Оранжевые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c39
Source: "Сборка (Собери Сам)\---Иконки---\Иконки снарядов\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c41
Source: "Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, радиус обзора)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "Сборка (Собери Сам)\---Мини карты---\Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "Сборка (Собери Сам)\---Мини карты---\Мини карта (Направление стволом противника и арты)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c44
Source: "Сборка (Собери Сам)\---Часы---\Часы в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c46
Source: "Сборка (Собери Сам)\---Часы---\Часы с датой в ангаре (Белые)\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c47
Source: "Сборка (Собери Сам)\---Часы---\Часы с датой в бою\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c48
Source: "Сборка (Собери Сам)\---Разное---\Дебуг панель\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c51
Source: "Сборка (Собери Сам)\---Разное---\Души танков\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c52
Source: "Сборка (Собери Сам)\---Разное---\Души танков в виде Оленя\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c53
Source: "Сборка (Собери Сам)\---Разное---\Зум\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c54
Source: "Сборка (Собери Сам)\---Разное---\Убираем черноту в снайперском режиме\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c55
Source: "Сборка (Собери Сам)\---Разное---\Цветные пробития\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c56
#endif
Source: BASS_Files\*; DestDir: {tmp}; Flags: dontcopy
Source: C:\Users\Farser\Desktop\BASS_Files\music.mp3; DestDir: {tmp}; Flags: dontcopy
Source: Images\Содержимое\{#Pic1}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic2}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic3}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic4}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic5}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic6}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic7}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic8}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic9}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic10}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic11}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic12}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic13}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic14}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic15}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic16}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic17}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic18}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic19}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic20}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic21}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic22}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic23}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic24}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic25}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic26}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic27}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic28}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic29}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic30}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic31}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic32}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic33}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic34}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic35}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic36}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic37}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic38}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic39}.bmp; Flags: dontcopy nocompression
Source: Images\Содержимое\{#Pic40}.bmp; Flags: dontcopy nocompression


[Icons]
Name: "{group}\{cm:UninstallProgram,World of Tanks}"; Filename: "{uninstallexe}"

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

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

const
UNDEF_INDEX = -777;
ALPHA_BLEND_LEVEL = 230; // max=Byte=255

WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);


Color = clblack;
procedure Formcolor();
begin
WizardForm.Font.Color:=clWhite;
WizardForm.TypesCombo.TabStop := False;
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.ReadyMemo.ScrollBars:= ssNone
WizardForm.DirEdit.TabStop := False;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.GroupEdit.TabStop := False;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
WizardForm.ComponentsList.TreeViewStyle := True;
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.PageNameLabel.Font.Color:=clWhite;
end;

var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;


type
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
try
with PicForm do
begin
SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
Show;
end;
finally
SetFocus(WizardForm.Handle);
end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Анимированный прицел (Снайперский)': UndefPic := '{#Pic1}.bmp';
'Белый прицел': UndefPic := '{#Pic2}.bmp';
'Прицел как у 40 тонн': UndefPic := '{#Pic3}.bmp';
'Прицел Кирилла Орешкина (Зеленый)': UndefPic := '{#Pic4}.bmp';
'Прицел Кирилла Орешкина (Синий)': UndefPic := '{#Pic5}.bmp';
'Сведение с Пробитием снаряда и Толщиной брони': UndefPic := '{#Pic6}.bmp';
'Снайперский прицел (Простой)': UndefPic := '{#Pic7}.bmp';
'Снайперский прицел Warface': UndefPic := '{#Pic8}.bmp';
'Снайперский прицел Минималистический': UndefPic := '{#Pic9}.bmp';
'Спайперский прицел ZX mini': UndefPic := '{#Pic10}.bmp';
'Анимированный Арт-прицел': UndefPic := '{#Pic11}.bmp';
'Арт-прицел (Белый)': UndefPic := '{#Pic12}.bmp';
'Арт-прицел (Простой)': UndefPic := '{#Pic13}.bmp';
'Необычный Арт-прицел': UndefPic := '{#Pic14}.bmp';
'Анимированная Дамаг панель': UndefPic := '{#Pic15}.bmp';
'Дамаг панель (Прозрачная)': UndefPic := '{#Pic16}.bmp';
'Дамаг панель (Прозрачная) с таймером починки': UndefPic := '{#Pic17}.bmp';
'Дамаг панель (С новыми иконками модулей)': UndefPic := '{#Pic18}.bmp';
'Дамаг панель Xbox': UndefPic := '{#Pic19}.bmp';
'Дамаг панель Бионик (Зеленый)': UndefPic := '{#Pic20}.bmp';
'Дамаг панель Бионик (Черный)': UndefPic := '{#Pic21}.bmp';
'Дамаг панель в стиле RPG': UndefPic := '{#Pic22}.bmp';
'Дамаг панель от zayaz': UndefPic := '{#Pic23}.bmp';
'Китайская дамаг панель': UndefPic := '{#Pic24}.bmp';
'Дамаг индикатор (Легкий)': UndefPic := '{#Pic25}.bmp';
'Дамаг индикатор (Простой)': UndefPic := '{#Pic26}.bmp';
'Дамаг индикатор (Пуля)': UndefPic := '{#Pic27}.bmp';
'Дамаг индикатор Warface': UndefPic := '{#Pic28}.bmp';
'Дамаг индикатор': UndefPic := '{#Pic29}.bmp';
'Маркер фокуса (Атакую) желтый': UndefPic := '{#Pic30}.bmp';
'Маркер фокуса (Атакую) зеленый': UndefPic := '{#Pic31}.bmp';
'Маркер фокуса (Атакую) красный': UndefPic := '{#Pic32}.bmp';
'Маркер фокуса (Атакую) синий': UndefPic := '{#Pic33}.bmp';
'УГН для ПТ (Желтые)': UndefPic := '{#Pic34}.bmp';
'УГН для ПТ в стиле zayaz': UndefPic := '{#Pic35}.bmp';
'УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта': UndefPic := '{#Pic36}.bmp';
'УГН для ПТ и Арты (Квадратные)': UndefPic := '{#Pic37}.bmp';
'УГН для ПТ и Арты (Оранжевые)': UndefPic := '{#Pic38}.bmp';
'Иконки снарядов': UndefPic := '{#Pic39}.bmp';
'Мини карта (Названия танков, луч, радиус обзора)': UndefPic := '{#Pic40}.bmp';
else
begin
LastIndex := UNDEF_INDEX;
PicForm.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
PicForm.Hide;
end;


procedure InitInfo();
begin
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;
PicForm := TForm.Create(WizardForm)
with PicForm do
begin
BorderStyle := bsNone;
FormStyle := fsStayOnTop;
InfoPic := TBitmapImage.Create(PicForm)
with InfoPic do
begin
Parent := PicForm;
AutoSize := True;
end;
end;
end;





procedure InitializeWizard();
begin
Formcolor();
InitInfo();
WizardForm.TypesCombo.Visible := False;

ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');

BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
BASS_DeInit; //Освобождаем процесс
gdipShutdown
end;

saurn 26-10-2013 12:40 2241347

Farser21, тьфу, сразу не понял, что вам нужно :)
Насколько мне известно(могу и ошибатся), при использовании флага exclusive хотя бы один компонент, из имеющих этот флаг, будет отмечен по умолчанию.
Но можно снять отметки со всех компонентов через код:
читать дальше »
Код:


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

const
   
UNDEF_INDEX      = -777;
    ALPHA_BLEND_LEVEL = 230; // max=Byte=255

   
WS_EX_LAYERED    = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY    = 1;
    LWA_ALPHA        = 2;
    GWL_EXSTYLE      = (-20);

    Color = clblack;
   
   
type
   
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL;
    external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean;
    external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint;
    external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
    external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND;
    external 'SetFocus@user32.dll stdcall';
   
   
var
   
InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;
   
   
procedure Formcolor();
begin
   
WizardForm.Font.Color:=clWhite;
    WizardForm.TypesCombo.TabStop := False;
    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.ReadyMemo.ScrollBars:= ssNone
    WizardForm.DirEdit.TabStop := False;
    WizardForm.TypesCombo.Color:=Color;
    WizardForm.WelcomeLabel1.Color:=Color;
    WizardForm.WelcomeLabel1.Font.Color:=clWhite;
    WizardForm.GroupEdit.TabStop := False;
    WizardForm.InfoBeforeClickLabel.Color:=Color;
    WizardForm.MainPanel.Color:=Color;
    WizardForm.PageNameLabel.Color:=Color;
    WizardForm.PageDescriptionLabel.Color:=Color;
    WizardForm.ReadyLabel.Color:=Color;
    WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
    WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
    WizardForm.ComponentsList.TreeViewStyle := True;
    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.PageNameLabel.Font.Color:=clWhite;
end;


procedure ShowPicHint(const PicFilePath: String);
var
   
pt: TPoint;
begin
    if not
GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with
PicForm do
        begin
           
SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
       
SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
   
UndefPic: String;
begin
    if
Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case
TNewCheckListBox(Sender).ItemCaption[Index] of
           
'Анимированный прицел (Снайперский)': UndefPic := '{#Pic1}.bmp';
            'Белый прицел': UndefPic := '{#Pic2}.bmp';
            'Прицел как у 40 тонн': UndefPic := '{#Pic3}.bmp';
            'Прицел Кирилла Орешкина (Зеленый)': UndefPic := '{#Pic4}.bmp';
            'Прицел Кирилла Орешкина (Синий)': UndefPic := '{#Pic5}.bmp';
            'Сведение с Пробитием снаряда и Толщиной брони': UndefPic := '{#Pic6}.bmp';
            'Снайперский прицел (Простой)': UndefPic := '{#Pic7}.bmp';
            'Снайперский прицел Warface': UndefPic := '{#Pic8}.bmp';
            'Снайперский прицел Минималистический': UndefPic := '{#Pic9}.bmp';
            'Спайперский прицел ZX mini': UndefPic := '{#Pic10}.bmp';
            'Анимированный Арт-прицел': UndefPic := '{#Pic11}.bmp';
            'Арт-прицел (Белый)': UndefPic := '{#Pic12}.bmp';
            'Арт-прицел (Простой)': UndefPic := '{#Pic13}.bmp';
            'Необычный Арт-прицел': UndefPic := '{#Pic14}.bmp';
            'Анимированная Дамаг панель': UndefPic := '{#Pic15}.bmp';
            'Дамаг панель (Прозрачная)': UndefPic := '{#Pic16}.bmp';
            'Дамаг панель (Прозрачная) с таймером починки': UndefPic := '{#Pic17}.bmp';
            'Дамаг панель (С новыми иконками модулей)': UndefPic := '{#Pic18}.bmp';
            'Дамаг панель Xbox': UndefPic := '{#Pic19}.bmp';
            'Дамаг панель Бионик (Зеленый)': UndefPic := '{#Pic20}.bmp';
            'Дамаг панель Бионик (Черный)': UndefPic := '{#Pic21}.bmp';
            'Дамаг панель в стиле RPG': UndefPic := '{#Pic22}.bmp';
            'Дамаг панель от zayaz': UndefPic := '{#Pic23}.bmp';
            'Китайская дамаг панель': UndefPic := '{#Pic24}.bmp';
            'Дамаг индикатор (Легкий)': UndefPic := '{#Pic25}.bmp';
            'Дамаг индикатор (Простой)': UndefPic := '{#Pic26}.bmp';
            'Дамаг индикатор (Пуля)': UndefPic := '{#Pic27}.bmp';
            'Дамаг индикатор Warface': UndefPic := '{#Pic28}.bmp';
            'Дамаг индикатор': UndefPic := '{#Pic29}.bmp';
            'Маркер фокуса (Атакую) желтый': UndefPic := '{#Pic30}.bmp';
            'Маркер фокуса (Атакую) зеленый': UndefPic := '{#Pic31}.bmp';
            'Маркер фокуса (Атакую) красный': UndefPic := '{#Pic32}.bmp';
            'Маркер фокуса (Атакую) синий': UndefPic := '{#Pic33}.bmp';
            'УГН для ПТ (Желтые)': UndefPic := '{#Pic34}.bmp';
            'УГН для ПТ в стиле zayaz': UndefPic := '{#Pic35}.bmp';
            'УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта': UndefPic := '{#Pic36}.bmp';
            'УГН для ПТ и Арты (Квадратные)': UndefPic := '{#Pic37}.bmp';
            'УГН для ПТ и Арты (Оранжевые)': UndefPic := '{#Pic38}.bmp';
            'Иконки снарядов': UndefPic := '{#Pic39}.bmp';
            'Мини карта (Названия танков, луч, радиус обзора)': UndefPic := '{#Pic40}.bmp';
        else
            begin
               
LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
       
LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
   
PicForm.Hide;
end;


procedure InitInfo();
begin
   
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
       
BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
           
Parent := PicForm;
            AutoSize := True;
        end;
    end;
end;





procedure InitializeWizard();
var
   
i, iCount: Integer;
begin
   
Formcolor();
    InitInfo();
    WizardForm.TypesCombo.Visible := False;

    iCount := WizardForm.ComponentsList.Items.Count - 1;

    for i := iCount downto 0 do
     
WizardForm.ComponentsList.Checked[i]:= False;

    ExtractTemporaryFile('BASS.dll');
    ExtractTemporaryFile('CallbackCtrl.dll');
    ExtractTemporaryFile('botva2.dll');
    ExtractTemporaryFile('MusicButton.png');
    ExtractTemporaryFile('Music.mp3');

    BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
   
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
   
BASS_DeInit; //Освобождаем процесс
   
gdipShutdown
end;


Farser21 26-10-2013 12:45 2241351

saurn, Вставил код, о в итоге флажок пропал только с 1 раздела. Как сделать чтобы он пропал на остальных? Заранее спасибо.

saurn 26-10-2013 12:59 2241358

Цитата:

Цитата Farser21
Вставил код, о в итоге флажок пропал только с 1 раздела »

Проверил еще раз - флажки снимаются со всех компонентов.
Добавьте в секцию [Setup] строчку ComponentsListTVStyle=yes так как у вас в компонентах присутствует флаг collapsed

Farser21 26-10-2013 13:07 2241363

saurn, Все разобрался, спасибо большое.

Nordek 26-10-2013 13:18 2241368

Цитата:

Цитата Farser21
Как сделать так чтобы изначально флажки не где не стояли »

Цитата:

Цитата Farser21
в том то и дело что такой строчки у меня нету. »

Посмотрел, флажки и так изначально не стоят.

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

Farser21, Кстати, удали в скрипте лишний [code], не к чему он там.
Цитата:

Цитата Farser21
[code]
[code]

»


P.S Farser21,
читать дальше »
Что касается твоих вставленных сюда скриптов. Пожалуйста, когда постишь, захватывай в BB-код
Вот так
[CODE]
Сюда вставляешь код/скрипт
[/CODE]

И перед вставкой сюда, не забывай так же в секции [Code] своего скрипта добавить звёздочку или хотябы решётку
для того чтоб форматирование на форуме не сбилось при захватывании в BB-код [CODE][/CODE]
Вот так [*Code] или так [#Code]


Пример вставки:
Код:

[Setup]
AppName=My Program
AppVersion=1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup

[Languages]
Name: default; MessagesFile: compiler:Default.isl

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent

[#Code]
procedure InitializeWizard();
begin
  with WizardForm.TypesCombo.Visible := False;
end;


Farser21 26-10-2013 13:33 2241372

Nordek, с флажками уже разобрался. Ок учту если еще что-то буду добавлять сюда.

Nordek 26-10-2013 13:36 2241375

Ещё, Farser21,
читать дальше »
Цитата:

Цитата saurn
(пакуемые файлы не нужны) »

Я изначально туда вставил
Код:

#define Files

#ifdef Files
#endif

Код:

#define Files

#ifdef Files

[Files]
#endif

не везде.

При комментировании
Код:

//#define Files

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

Dinvin4ester 27-10-2013 00:45 2241678

А мне не поможете ?

saurn 27-10-2013 10:59 2241781

Цитата:

Цитата Dinvin4ester
сделать музыку по умолчанию , а то при запуске и когда установка идет ее не выключить »

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

[Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
procedure RedesignWizardForm;
begin
  with WizardForm.DiskSpaceLabel do
  begin
    Left := ScaleX(-416);
    Top := ScaleY(200);
    Height := ScaleY(46);
  end;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

const
  PCFonFLY=true;
  notPCFonFLY=false;
  BASS_SAMPLE_LOOP = 4; //повторение

var
  LabelPct1,LabelTime1,LabelTime2,LabelTime3,FinishedLbl: TLabel;
#ifdef SecondProgressBar
  LabelPct2: TLabel;
  ISDoneProgressBar2:TNewProgressBar;
#endif
  ISDoneCancel, i, CurrentPicture:integer;
  ISDoneError:boolean;
  PCFVer:double;
  TimerID: LongWord;
  PicList: TStringlist;
  BackgroundForm: TForm;
  MusicButton, VolumeUP, VolumeDown, MyButton: TButton;
  VolumeInd: TNewProgressBar;
  BackgroundBitmapImage: TBitmapImage;
  s, Name, ResultStr: string;
  Ver, VerREG : Cardinal;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
  TProc=procedure(HandleW, msg, idEvent, TimeSys: 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 ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
function WrapTimerProc(callback:TProc; 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';
function GetSystemMetrics(nIndex:Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall';
procedure InitializeSlideShow(Hwnd:Thandle; l,t,w,h:integer;Animate:boolean; Stretch:integer); external 'InitializeSlideShow@files:isslideshow.dll stdcall';
procedure DeinitializeSlideShow; external 'DeinitializeSlideShow@files:isslideshow.dll stdcall';
procedure ShowImage(ipath:PAnsiChar; Effect:integer); external 'ShowImage@files:isslideshow.dll stdcall';

// ================= Процедуры работы со свуком =====================  \\
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_Pause(): Boolean; external 'BASS_Pause@files:BASS.dll stdcall delayload';
function BASS_SetVolume(volume: DWORD): BOOL; external 'BASS_SetVolume@files:BASS.dll stdcall delayload';
function BASS_GetVolume: Integer; external 'BASS_GetVolume@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@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 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 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 ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then WizardForm.ProgressGauge.Position := OveralPct div 10;
  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
  WizardForm.FilenameLabel.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, WizardForm.FilenameLabel.Font, WizardForm.FilenameLabel.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 MusicButtonOnClick(Sender: TObject);
begin
    case TButton(Sender).Caption of
        'Play':
        begin
            BASS_Start;
            MusicButton.Caption := 'Stop';
        end;
        'Stop':
        begin
            BASS_Pause;
            MusicButton.Caption := 'Play';
        end;
    end;
end;

// увеличения громкости
procedure VolumeUPOnClick(Sender: TObject);
var
vol : integer;
begin
  vol := BASS_GetVolume;
  if vol+5 >= 100 then // Увеличение громкости по 5 едини.... пример (vol+5) - (vol+10) и.т.д.
  begin
    BASS_SETVolume(100);
    VolumeIND.position := 100;
    VolumeUP.Enabled := False;
  end else
  begin
    BASS_SETVolume(vol+5);
    VolumeIND.position := vol+5;
    VolumeDOWN.Enabled := True;
  end;
end;

// уменьшение громкости
procedure VolumeDOWNOnClick(Sender: TObject);
var
vol : integer;
begin
  vol := BASS_GetVolume;
  if vol-5 <= 0 then
  begin
    BASS_SETVolume(0);
    VolumeIND.position := 0;
    VolumeDOWN.Enabled := False;
  end else
  begin
    BASS_SETVolume(vol-5);
    VolumeIND.position := vol-5;
    VolumeUP.Enabled := True;
  end;
end;

procedure InitMusic();
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('music.mp3');
  if BASS_Init(-1, 44100, 0, 0, 0) then
  begin
    BASS_Start();
    Name:=ExpandConstant('{tmp}\music.mp3');
    i:=BASS_StreamCreateFile(FALSE, PChar(Name), 0, 0, 4);
    if i <> 0 then
    begin
    BASS_ChannelPlay(i, True);
    end;
  end;
 
  // Music Button on/off
  MusicButton := TButton.Create(WizardForm);
  with MusicButton do
  begin
    Left := 4//WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
    Top := 337//WizardForm.CancelButton.Top;
    Width := 131//WizardForm.CancelButton.Height;
    Height := 17//WizardForm.CancelButton.Height;
    Caption := 'Play';
    Hint := 'Вкл.\Выкл. музыку';
    ShowHint := True;
    OnClick := @MusicButtonOnClick;
    Parent := WizardForm;
  end;
 
  if MusicButton.Caption = 'Stop' then BASS_Start else BASS_Pause;
end;

/////////////////////////////////////////////////////////////////////////////////////////////////
procedure InitializeWizard();
begin
  InitMusic();
  RedesignWizardForm;
  with WizardForm do
  begin
    ExtractTemporaryFile('folder.bmp');
    SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\folder.bmp');
    SelectDirBitmapImage.SetBounds(0,0,42,42);
    ExtractTemporaryFile('folder1.bmp');
    SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\folder1.bmp')
    SelectGroupBitmapImage.SetBounds(0,0,42,42);
    ExtractTemporaryFile('img1.bmp');
    WizardBitmapImage.SetBounds(0,0,500,313);
    WizardBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\img1.bmp'));
    ExtractTemporaryFile('img2.bmp');
    WizardBitmapImage2.SetBounds(0,0,500,313);
    WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\img2.bmp'));
    WizardSmallBitmapImage.SetBounds(0,0,497,58);
    PageNameLabel.Hide; //Del, если нужно вернуть текст
    PageDescriptionLabel.Hide; //Del, если нужно вернуть текст
  end;

  //WelcomePage,
  with TLabel.Create(WizardForm) do
  begin
    Left:= ScaleX(100);
    Top:= ScaleY(7);
    Width:= ScaleX(300);
    Height:= ScaleY(80);
    AutoSize:= false;
    Alignment := taCenter;
    Transparent:= true;
    WordWrap:= true;
    Font.Size:= 14;
    Font.Color:=ClWhite
    Font.Style := [fsBold]
    Parent:= WizardForm.WelcomePage;
    Font.Name:= 'Georgia'
    //Caption:= WizardForm.WelcomeLabel1.Caption;
  end;

  with TLabel.Create(WizardForm) do
  begin
    Top:= ScaleY(245);
    Left:= ScaleX(25);
    Width:= ScaleX(450);
    Height:= ScaleY(270);
    AutoSize:= false;
    Alignment := taCenter;
    WordWrap:= true;
    Font.Color:=ClWhite
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Transparent:= true;
    Parent:= WizardForm.WelcomePage;
    //Caption:= ExpandConstant('{cm:Welcome2}');
  end;

  with TLabel.Create(WizardForm) do
  begin
    Left:= ScaleX(100);
    Top:= ScaleY(7);
    Width:= ScaleX(300);
    Height:= ScaleY(80);
    AutoSize:= false;
    Alignment := taCenter;
    WordWrap:= true;
    Font.Size:= 14;
    Font.Color:=ClWhite
    Font.Name:= 'Georgia'
    Font.Style := [fsBold]
    Transparent:= true;
    Parent:= WizardForm.FinishedPage;
    //Caption:= WizardForm.FinishedHeadingLabel.Caption;
  end;

  FinishedLbl:= TLabel.Create(WizardForm);
  with FinishedLbl do
  begin
    Left:= ScaleX(25);
    Top:= ScaleY(245);
    Width:= ScaleX(450);
    Height:= ScaleY(160);
    AutoSize:= false;
    Alignment := taCenter;
    WordWrap:= true;
    Transparent:= true;
    Font.Color:=ClWhite
    Font.Size:= 10;
    Font.Name:= 'Georgia'
    Parent:= WizardForm.FinishedPage;
    //Caption:= ExpandConstant('{cm:Finished2}');
  end;

  LabelPct1 := TLabel.Create(WizardForm);
  with LabelPct1 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := WizardForm.ProgressGauge.Width+ScaleX(5);
    Top      := WizardForm.ProgressGauge.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
#ifdef SecondProgressBar
  ISDoneProgressBar2 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar2 do begin
    Parent  := WizardForm.InstallingPage;
    Left    := ScaleX(0);
    Top      := ScaleY(83);
    Width    := WizardForm.ProgressGauge.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    := WizardForm.ProgressGauge.Width div 2;
    Left    := ScaleX(0);
    Top      := ScaleY(85);
  end;
  LabelTime2 := TLabel.Create(WizardForm);
  with LabelTime2 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := LabelTime1.Width+ScaleX(40);
    Left    := 280;
    Top      := LabelTime1.Top;
  end;
  LabelTime3 := TLabel.Create(WizardForm);
  with LabelTime3 do begin
    Parent  := WizardForm.FinishedPage;
    AutoSize := False;
    Width    := 300;
    Left    := 180;
    Top      := 200;
  end;
  //==splash
//  ExtractTemporaryFile('splash.png');
//  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
//  //==slides
//  BackgroundForm:= TForm.Create(nil);
//  BackgroundForm.BorderStyle:= bsNone;
//  BackgroundForm.Color:=clBlack;
//  BackgroundForm.SetBounds(0, 0, GetSystemMetrics(0), GetSystemMetrics(1))
//  BackgroundForm.Visible:=True;
//  BackgroundForm.enabled:= false;
//  PicList:=tstringlist.Create;
//  ExtractTemporaryFile('0.jpg');
//  piclist.add(ExpandConstant('{tmp}') + '\1.jpg');
//  BackgroundForm.show;
//  InitializeSlideShow(BackgroundForm.Handle, 0, 0, GetSystemMetrics(0), GetSystemMetrics(1), false, 1);
//  ShowImage(ExpandConstant('{tmp}') + '\0.jpg', 1);

//Volum up
  VolumeDown := TButton.Create(WizardForm);
  with VolumeDown do
  begin
    Left := 4
    Top := 318
    Width := WizardForm.CancelButton.Height;
    Height := 17
    Caption := '-';
    Hint := 'Убавить громкость';
    ShowHint := True;
    OnClick := @VolumeDOWNOnClick;
    Parent := WizardForm;
  end;

//Volum down
  VolumeUP := TButton.Create(WizardForm);
  with VolumeUP do
  begin
    Left := 112//WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeDown.Width;
    Top := 318
    Width := WizardForm.CancelButton.Height;
    Height := 17
    Caption := '+';
    Hint := 'Прибавить громкость';
    ShowHint := True;
    OnClick := @VolumeUPOnClick;
    Parent := WizardForm;
  end;

  VolumeIND := TNewProgressBar.Create(WizardForm);
  with VolumeIND do
  begin
    Parent := WizardForm;
    Left := 30//WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width + MusicButton.Width + VolumeUP.Width + VolumeDown.Width;
    Top := 320//WizardForm.CancelButton.Top;
    Width := 80//WizardForm.CancelButton.Width;
    Height := 14//WizardForm.CancelButton.Height;
    Min := 0;
    Max := 100;
    Position := BASS_GetVolume;
  end;

  if BASS_GetVolume >= 100 then volumeUP.Enabled := False;
  if BASS_GetVolume <= 0 then volumeDOWN.Enabled := False;
end;

//  ***********  Конец для управления музыкой

//procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
//begin
// CurrentPicture:=CurrentPicture+1;
// if CurrentPicture=piclist.count+1 then CurrentPicture:=1;
//  ShowImage(piclist.strings[CurrentPicture - 1], 1);
//end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.FinishedHeadingLabel.Hide;
  WizardForm.FinishedLabel.Hide;
  Case CurPageID of
  wpInstalling:
  begin
    CurrentPicture:=1;
    with WizardForm do
    begin
      hide;
      MainPanel.Visible:=False;
      Bevel1.Visible:=False;
      setbounds(ScaleX(GetSystemMetrics(0)-420), ScaleY(GetSystemMetrics(1)-167), ScaleX(395), ScaleY(142));
      InnerNotebook.setbounds(ScaleX(10), ScaleY(10), ScaleX(370), InnerNotebook.height);
      StatusLabel.setbounds(ScaleX(0), ScaleY(0), InnerNotebook.Width, StatusLabel.height);
      FileNameLabel.setbounds(ScaleX(0), ScaleY(15), InnerNotebook.Width, FileNameLabel.height);
      ProgressGauge.Top:=ScaleY(40);
      ProgressGauge.Width:=InnerNotebook.Width;
      CancelButton.Left:=ScaleX(154);
      CancelButton.Top:=ScaleY(82);
      CancelButton.bringtofront;
      show;
    end;
//    ShowImage(piclist.strings[CurrentPicture - 1], 1);
//    TimerID:=SetTimer(0, 0, 6000, WrapTimerProc(@OnTimer, 4));
  end;
  wpFinished:
  begin
    LabelTime3.Hide;
    WizardForm.Visible:=False;
    WizardForm.setbounds((GetSystemMetrics(0)-WizardForm.Width) div 2, (GetSystemMetrics(1)-WizardForm.Height) div 2, ScaleX(502), ScaleY(392));
    WizardForm.Visible:=True;
    KillTimer(0, TimerID);
//    showimage(ExpandConstant('{tmp}') + '\0.jpg', 1);
  if ISDoneError then
  begin
    LabelTime3.Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    FinishedLbl.Font.Color:= clRed;
    FinishedLbl.Caption:= SetupMessage(msgSetupAborted) ;
  end;
  end;
 end;
end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('Tiger.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
  Result := True;
end;

procedure DeinitializeSetup();
begin
 DeinitializeSlideShow;
 KillTimer(0, TimerID);
 BASS_Stop();
 BASS_Free();
 ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
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.CancelButton.OnClick:= @CancelButtonOnClick;
    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');
#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'), $F444, 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}\data1.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
        //if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data2.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
        //if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data3.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
        //if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data4.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
        //if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data5.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
        //if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data6.bin'), 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;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;


Dinvin4ester 27-10-2013 13:54 2241879

saurn,
Все получилось , а с этой не поможете ?
Цитата:

Цитата Dinvin4ester
Ребята, помогите вставить музыку в инсталл - http://sendfile.su/886037. »


saurn 27-10-2013 16:10 2241950

Цитата:

Цитата Dinvin4ester
а с этой не поможете ? »

Без регулятора уровня громкости. Только кнопка Старт/Стоп
http://rghost.ru/49756930

Dinvin4ester 27-10-2013 16:24 2241963

saurn,
Благодарю. А можно еще узнать - можно ли как-то чтоб музыка шла сразу при запуске инсталлятора ?

saurn 27-10-2013 16:39 2241976

Цитата:

Цитата Dinvin4ester
можно ли как-то чтоб музыка шла сразу при запуске инсталлятора ? »

Можно конечно.
читать дальше »
Код:

[Code]
const
 
TfontColor = $ffffff;

var
 
Wizard1,Wizard2,Wizard3,Wizard4,Wizard5,Wizard6,Wizard7,Wizard8,Wizard9,Wizard10,
  Wizard11,Wizard12,Wizard13,Wizard14,Wizard15,Wizard16,Wizard17,Wizard18,Wizard19,Wizard20,Wizard21,Wizard22: LongInt;
  hCancelBtn, hNextBtn, hBackBtn, hMusicButton, hDirBrowseBtn, hGroupBrowseBtn, hLogoBtn, StartBtn, IconBtn, hMyCancelBtn, Font1, Font2: HWND;
  ButtonFont: TFont;
  FreeMB, TotalMB: Cardinal;
  WelcomLabel1, SelectDirLabel, DirEditLabel, InstallSpacelabel1, InstallSpacelabel2, GroupEditLabel,
  SelectGroupLabel, NoStartLabel, TaskLabel, IconLabel, LabelStatus, LabelFinish: TLabel;
  MusicButton: TButton;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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_Pause(): Boolean; external 'BASS_Pause@files:BASS.dll stdcall delayload';
function BASS_SetVolume(volume: DWORD): BOOL; external 'BASS_SetVolume@files:BASS.dll stdcall delayload';
function BASS_GetVolume: Integer; external 'BASS_GetVolume@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@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';
function NewFont(Height:Integer;thickness,italic,underline,strikeout:DWORD;name:String):hWnd;external 'NewFont@files:IsMyFont.dll stdcall delayload';
procedure Deinitialize;external 'Deinitialize@files:IsMyFont.dll stdcall delayload';

procedure IsMyFont;
begin
 
Font1:=NewFont(20,500,0,0,0,'Corbel');
  Font2:=NewFont(17,500,0,0,0,'Franklin Gothic Medium');
  WizardForm.Font.Handle:=Font1;
  WizardForm.Font.Color:=TfontColor;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure wzform;
begin
 
WizardForm.ClientWidth:=600;
  WizardForm.ClientHeight:=400;
  WizardForm.InnerNotebook.hide;
  WizardForm.OuterNotebook.hide;
  WizardForm.OuterNotebook.hide;
  WizardForm.Bevel.Hide;
  WizardForm.Position:=poScreenCenter;
  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.SetBounds(ScaleX(30), ScaleY(163), ScaleX(540), ScaleY(26));
end;

procedure SetStateNewButtons;
begin
  with
WizardForm.BackButton do begin
   
BtnSetText(hBackBtn,PAnsiChar(Caption));
    BtnSetVisibility(hBackBtn,Visible);
  end;
  with WizardForm.NextButton do begin
   
BtnSetText(hNextBtn,PAnsiChar(Caption));
    BtnSetVisibility(hNextBtn,Visible);
  end;
  with WizardForm.CancelButton do begin
   
BtnSetText(hCancelBtn,PAnsiChar(Caption));
    BtnSetVisibility(hCancelBtn,Visible);
  end;
  with MusicButton do begin
   
BtnSetText(hMusicButton,PAnsiChar(Caption));
    BtnSetVisibility(hMusicButton,Visible);
  end;
  BtnSetText(hDirBrowseBtn,PAnsiChar(WizardForm.DirBrowseButton.Caption));
  BtnSetText(hGroupBrowseBtn,PAnsiChar(WizardForm.GroupBrowseButton.Caption));
end;

procedure LogoBtnClick(hBtn:HWND);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://forum.krinkels.ru/index.php', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

procedure WizardFormBtnClick(hBtn:HWND);
var
 
Btn:TButton;
begin
  case
hBtn of
   
hCancelBtn: Btn:=WizardForm.CancelButton;
    hNextBtn: Btn:=WizardForm.NextButton;
    hBackBtn: Btn:=WizardForm.BackButton;
    hMusicButton: Btn:=MusicButton;
    hDirBrowseBtn: Btn:=WizardForm.DirBrowseButton;
    hGroupBrowseBtn: Btn:=WizardForm.GroupBrowseButton;
  end;
  Btn.OnClick(Btn);
  SetStateNewButtons;
  BtnRefresh(hBtn);
end;

procedure MusicButtonOnClick(Sender: TObject);
begin
    case
TButton(Sender).Caption of
       
'Играть':
        begin
           
BASS_Start;
            MusicButton.Caption := 'Стоп';
        end;
        'Стоп':
        begin
           
BASS_Pause;
            MusicButton.Caption := 'Играть';
        end;
    end;
end;

procedure InitMusic();
var
   
Name: String;
    i: Integer;
begin
   
ExtractTemporaryFile('BASS.dll');
    ExtractTemporaryFile('music.mp3');
    if BASS_Init(-1, 44100, 0, 0, 0) then
    begin
       
BASS_Start();
        Name := ExpandConstant('{tmp}\music.mp3');
        i := BASS_StreamCreateFile(FALSE, PChar(Name), 0, 0, 4);
        if i <> 0 then
        begin
           
BASS_ChannelPlay(i, True);
        end;
    end;
end;

procedure btn;
begin
   
ButtonFont:=TFont.Create;
    ButtonFont.Handle:=Font2;
    hLogoBtn:=BtnCreate(WizardForm.Handle,12,335,116,52,ExpandConstant('{tmp}\Button2.png'),15,False);
    BtnSetEvent(hLogoBtn,BtnClickEventID,WrapBtnCallback(@LogoBtnClick,1));
    BtnSetCursor(hLogoBtn,GetSysCursorHandle(32649));
  with WizardForm.CancelButton do begin
   
hCancelBtn:=BtnCreate(WizardForm.Handle,495,339,100,46,ExpandConstant('{tmp}\Button1.png'),15,False);
    BtnSetEvent(hCancelBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
    BtnSetFont(hCancelBtn,ButtonFont.Handle);
    Width:=0;
    Height:=0;
  end;
  with WizardForm.NextButton do begin
   
hNextBtn:=BtnCreate(WizardForm.Handle,385,339,100,46,ExpandConstant('{tmp}\Button1.png'),15,False);
    BtnSetEvent(hNextBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
    BtnSetFont(hNextBtn,ButtonFont.Handle);
    Width:=0;
    Height:=0;
  end;
  with WizardForm.BackButton do begin
   
hBackBtn:=BtnCreate(WizardForm.Handle,285,339,100,46,ExpandConstant('{tmp}\Button1.png'),15,False);
    BtnSetEvent(hBackBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
    BtnSetFont(hBackBtn,ButtonFont.Handle);
    Width:=0;
    Height:=0;
  end;
  MusicButton := TButton.Create(nil);
  with MusicButton do
  begin
   
Caption := 'Стоп';
    Hint := 'Вкл.\Выкл. музыку';
    ShowHint := True;
    OnClick := @MusicButtonOnClick;
  end;
  with MusicButton do begin
   
hMusicButton:=BtnCreate(WizardForm.Handle,495,6,100,46,ExpandConstant('{tmp}\Button1.png'),15,False);
    BtnSetEvent(hMusicButton,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
    BtnSetFont(hMusicButton,ButtonFont.Handle);
    Width:=0;
    Height:=0;
  end;
  with WizardForm.DirBrowseButton do begin
   
hDirBrowseBtn:=BtnCreate(WizardForm.Handle,495,180,100,46,ExpandConstant('{tmp}\Button1.png'),15,False);
    BtnSetEvent(hDirBrowseBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
    BtnSetFont(hDirBrowseBtn,ButtonFont.Handle);
    Width:=0;
    Height:=0;
  end;
  with WizardForm.GroupBrowseButton do begin
   
hGroupBrowseBtn:=BtnCreate(WizardForm.Handle,495,180,100,46,ExpandConstant('{tmp}\Button1.png'),15,False);
    BtnSetEvent(hGroupBrowseBtn,BtnClickEventID,WrapBtnCallback(@WizardFormBtnClick,1));
    BtnSetFont(hGroupBrowseBtn,ButtonFont.Handle);
    Width:=0;
    Height:=0;
  end;
  ImgApplyChanges(WizardForm.Handle);
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure welcom;
begin
Wizard1:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\BGImage1.png'),0,0,WizardForm.ClientWidth,WizardForm.ClientHeight,True,True);
Wizard2:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage1.png'),0,315,WizardForm.ClientWidth,85,True,True);
Wizard3:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage3.png'),0,181,WizardForm.ClientWidth,138,True,True);
Wizard4:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage2.png'),3,205,590,91,True,True);

  WelcomLabel1:= TLabel.Create(WizardForm);
with WelcomLabel1 do begin
 
Left:= 30;
  Top:= 219;
  Width:= 550;
  Height:= 58;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
  Caption:=ExpandConstant('{cm:Welcom1}');
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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 MbOrTb(Float: Extended): String;
begin
if
Float < 1024 then Result:= NumToStr(Float)+ExpandConstant('{cm:Size1}') else
if
Float/1024 < 1024 then Result:= NumToStr(Float/1024)+ExpandConstant('{cm:Size2}') else
 
Result:= NumToStr(Float/(1024*1024))+ExpandConstant('{cm:Size3}');
end;

procedure DirEditOnChange(Sender: TObject);
var Drive: String;
begin
 
DirEditLabel.Caption:=MinimizePathName(WizardForm.DirEdit.Text, DirEditLabel.Font, DirEditLabel.Width);
  Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
  InstallSpacelabel1.Caption:=ExpandConstant('{cm:Install1}')+ MbOrTb({#NeedInstallSize});
  InstallSpacelabel2.Caption:=ExpandConstant('{cm:Install2}')+ MbOrTb({#NeedSinceInstallSize});
if WizardForm.CurPageID = wpWelcome then begin
end
;
if  (FreeMB>{#NeedInstallSize}) then begin
 
WizardForm.NextButton.Enabled:= (FreeMB>{#NeedInstallSize});
  BtnSetEnabled(hNextBtn, True);
end else begin
 
WizardForm.NextButton.Enabled:= (FreeMB>{#NeedInstallSize});
  BtnSetEnabled(hNextBtn, False);
end;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure SelectDir;
begin
Wizard6:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage4.png'),0,81,600,238,True,True);
Wizard7:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage5.png'),3,105,594,74,True,True);
Wizard8:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage6.png'),90,180,395,45,True,True);
Wizard9:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage7.png'),5,230,346,77,True,True);
Wizard10:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\FLRImage1.png'),17,170,79,64,True,True);

  SelectDirLabel:= TLabel.Create(WizardForm);
with SelectDirLabel do begin
 
Left:= 30;
  Top:= 119;
  Width:= 594;
  Height:= 74;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
  Caption:=ExpandConstant('{cm:SelectDir}');
end;

  DirEditLabel := TLabel.Create(WizardForm);
with DirEditLabel do begin
 
Left:=112;
  Top:= 191;
  Width:= 350;
  Height:= 20;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Caption := MinimizePathName(WizardForm.DirEdit.Text, DirEditLabel.Font, DirEditLabel.Width);
  Parent := WizardForm;
end;

  InstallSpacelabel1:= TLabel.Create(WizardForm);
with InstallSpacelabel1 do begin
 
Left:= 30;
  Top:= 244;
  Width:= 594;
  Height:= 74;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
end;

  InstallSpacelabel2:= TLabel.Create(WizardForm);
with InstallSpacelabel2 do begin
 
Left:= 30;
  Top:= 269;
  Width:= 594;
  Height:= 74;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
end;

  WizardForm.DirEdit.OnChange:=@DirEditOnChange;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure GroupChange(Sender: TObject);
begin
 
GroupEditLabel.Caption := MinimizePathName(WizardForm.GroupEdit.Text, GroupEditLabel.Font, GroupEditLabel.Width);
end;

function Group: Boolean;
begin
 
Result := BtnGetEnabled(hGroupBrowseBtn);
end;

procedure StartClick(hBtn:HWND);
var
 
Check:boolean;
begin
 
Check:=BtnGetChecked(hBtn);
if Check then begin
BtnSetEnabled(hGroupBrowseBtn, False)
GroupEditLabel.Font.Color:=$737373;
end else begin
BtnSetEnabled(hGroupBrowseBtn, True)
GroupEditLabel.Font.Color:=$FFFFFF
end;
end;

procedure NoIconsLabelClick(Sender:TObject);
begin
 
BtnSetChecked(StartBtn, not BtnGetChecked(StartBtn));
  StartClick(StartBtn);
end;

procedure ProgramGroup;
begin
Wizard11:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage8.png'),20,240,282,48,True,True);
StartBtn:=BtnCreate(WizardForm.Handle,19,247,28,32,ExpandConstant('{tmp}\Button3.png'),8,True);
BtnSetEvent(StartBtn,BtnClickEventID,WrapBtnCallback(@StartClick,1));

  GroupEditLabel := TLabel.Create(WizardForm);
with GroupEditLabel do begin
 
Left:=112;
  Top:= 191;
  Width:= 350;
  Height:= 20;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Caption := MinimizePathName(WizardForm.GroupEdit.Text, GroupEditLabel.Font, GroupEditLabel.Width);
  Parent := WizardForm;
end;

  SelectGroupLabel:= TLabel.Create(WizardForm);
with SelectGroupLabel do begin
 
Left:= 30;
  Top:= 119;
  Width:= 540;
  Height:= 74;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
  Caption:=ExpandConstant('{cm:SelectGroup}');
end;

  NoStartLabel:= TLabel.Create(WizardForm);
with NoStartLabel do begin
 
Left:= 44;
  Top:= 252;
  Width:= 250;
  Height:= 20;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
  OnClick:= @NoIconsLabelClick;
  Caption:=ExpandConstant('{cm:NoStart}');
end;

  WizardForm.GroupEdit.OnChange := @GroupChange;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function IconDP: Boolean;
begin
 
Result:= BtnGetChecked(IconBtn);
end;

procedure IconClick(hBtn:HWND);
var
 
Check:boolean;
begin
 
Check:=BtnGetChecked(hBtn);
end;

procedure IconLabelClick(Sender:TObject);
begin
 
BtnSetChecked(IconBtn, not BtnGetChecked(IconBtn));
  IconClick(IconBtn);
end;

procedure ProgramTask;
begin
Wizard12:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage8.png'),20,205,232,48,True,True);
IconBtn:=BtnCreate(WizardForm.Handle,39,211,28,32,ExpandConstant('{tmp}\Button3.png'),8,True);
BtnSetEvent(IconBtn,BtnClickEventID,WrapBtnCallback(@IconClick,1));
BtnSetChecked(IconBtn,True);

TaskLabel:= TLabel.Create(WizardForm);
with TaskLabel do begin
 
Left:= 30;
  Top:= 119;
  Width:= 540;
  Height:= 74;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
  Caption:=ExpandConstant('{cm:Task}');
end;

IconLabel:= TLabel.Create(WizardForm);
with IconLabel do begin
 
Left:= 64;
  Top:= 215;
  Width:= 170;
  Height:= 20;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Parent:= WizardForm;
  OnClick:= @IconLabelClick;
  Caption:=ExpandConstant('{cm:Icon}');
end;
end;

procedure CreateControls;
begin
 
Wizard13:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage10.png'),3,148,594,72,True,True);
 Wizard14:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage11.png'),190,105,84,52,True,True);
 Wizard15:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage9.png'),3,105,200,52,True,True);

  LabelStatus := TLabel.Create(WizardForm);
with LabelStatus do begin
 
Left:= 30;
  Top:= 119;
  Width:= 540;
  Height:= 74;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Caption:= ExpandConstant('{cm:Extracted}');
  Parent:= WizardForm;
end;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure Finish;
begin
Wizard16:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage12.png'),3,220,594,62,True,True);
Wizard17:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\SDWImage5.png'),3,215,594,72,True,True);

  LabelFinish := TLabel.Create(WizardForm);
with LabelFinish do begin
 
Left:= 30;
  Top:= 230;
  Width:= 550;
  Height:= 58;
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  ParentFont := True;
  Caption:= ExpandConstant('{cm:Finish2}');
  Parent:= WizardForm;
end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure InitializeWizard;
begin
InitMusic();
IsMyFont;
wzform;
btn;
welcom;
SelectDir;
ProgramGroup;
ProgramTask;
CreateControls;
Finish;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function InitializeSetup:boolean;
begin
  if not
FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
  if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('IsMyFont.dll');
  Result:=True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if
(PageID =wpLicense)or(PageID =wpInfoBefore)or(PageID =wpUserInfo)or(PageID =wpSelectTasks) then
 
Result:= True;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure Hide(CurPageID: Integer);
begin
 
WizardForm.ProgressGauge.hide;
  WelcomLabel1.hide;
  SelectDirLabel.hide;
  DirEditLabel.hide;
  InstallSpacelabel1.hide;
  InstallSpacelabel2.hide;
  GroupEditLabel.hide;
  SelectGroupLabel.hide;
  NoStartLabel.hide;
  TaskLabel.hide;
  IconLabel.hide;
  LabelStatus.hide;
  LabelFinish.hide;
  BtnSetVisibility(hDirBrowseBtn, False);
  BtnSetVisibility(hGroupBrowseBtn, False);
  ImgSetVisibility(Wizard3, False);
  ImgSetVisibility(Wizard4, False);
  ImgSetVisibility(Wizard6, False);
  ImgSetVisibility(Wizard7, False);
  ImgSetVisibility(Wizard8, False);
  ImgSetVisibility(Wizard9, False);
  ImgSetVisibility(Wizard10, False);
  ImgSetVisibility(Wizard11, False);
  ImgSetVisibility(Wizard12, False);
  ImgSetVisibility(Wizard13, False);
  ImgSetVisibility(Wizard14, False);
  ImgSetVisibility(Wizard15, False);
  ImgSetVisibility(Wizard16, False);
  ImgSetVisibility(Wizard17, False);
  BtnSetVisibility(StartBtn, False);
  BtnSetVisibility(IconBtn, False);
  BtnSetVisibility(hMyCancelBtn, False);
  BtnSetVisibility(hCancelBtn, False);
  ImgApplyChanges(WizardForm.Handle);
end;

procedure Show(CurPageID: Integer);
begin case CurPageID of
 
wpWelcome:
begin
 
ImgSetVisibility(Wizard3, True);
  ImgSetVisibility(Wizard4, True);
  BtnSetVisibility(hCancelBtn, True);
  BtnSetEnabled(hNextBtn, True);
  WelcomLabel1.Show;
  WizardForm.Caption:= ExpandConstant('{cm:Welcom}');
  ImgApplyChanges(WizardForm.Handle);
end;
  wpSelectDir:
begin
 
DirEditOnChange(nil)
  BtnSetVisibility(hCancelBtn, True);
  ImgSetVisibility(Wizard6, True);
  ImgSetVisibility(Wizard7, True);
  ImgSetVisibility(Wizard8, True);
  ImgSetVisibility(Wizard9, True);
  ImgSetVisibility(Wizard10, True);
  BtnSetVisibility(hDirBrowseBtn, True);
  SelectDirLabel.Show;
  DirEditLabel.Show;
  InstallSpacelabel1.Show;
  InstallSpacelabel2.Show;
  WizardForm.Caption:= ExpandConstant('{cm:SelectDir1}');
  ImgApplyChanges(WizardForm.Handle);
end;
  wpSelectProgramGroup:
begin
 
GroupChange(nil)
  GroupEditLabel.Show;
  SelectGroupLabel.Show;
  NoStartLabel.Show;
  WizardForm.Caption:= ExpandConstant('{cm:SelectGroup1}');
  BtnSetVisibility(hCancelBtn, True);
  ImgSetVisibility(Wizard6, True);
  ImgSetVisibility(Wizard7, True);
  ImgSetVisibility(Wizard8, True);
  ImgSetVisibility(Wizard10, True);
  ImgSetVisibility(Wizard11, True);
  BtnSetVisibility(hGroupBrowseBtn, True);
  BtnSetVisibility(StartBtn, True);
  ImgApplyChanges(WizardForm.Handle);
end;
  wpReady:
begin
 
TaskLabel.Show;
  IconLabel.Show;
  WizardForm.Caption:= ExpandConstant('{cm:Task1}');
  BtnSetVisibility(hCancelBtn, True);
  ImgSetVisibility(Wizard6, True);
  ImgSetVisibility(Wizard7, True);
  ImgSetVisibility(Wizard12, True);
  BtnSetVisibility(IconBtn, True);
  ImgApplyChanges(WizardForm.Handle);
end;
  wpInstalling:
begin
 
WizardForm.ProgressGauge.Show;
  LabelStatus.Show;
  BtnSetVisibility(hCancelBtn, True);
  ImgSetVisibility(Wizard6, True);
  ImgSetVisibility(Wizard13, True);
  ImgSetVisibility(Wizard14, True);
  ImgSetVisibility(Wizard15, True);
  ImgApplyChanges(WizardForm.Handle);
end;
  wpFinished:
begin
 
LabelFinish.Show;
  WizardForm.Caption:= ExpandConstant('{cm:Finish1}');
  ImgSetVisibility(Wizard3, True);
  ImgSetVisibility(Wizard17, True);
  ImgApplyChanges(WizardForm.Handle);
end;
end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
 
SetStateNewButtons;
  Hide(CurPageID);
  Show(CurPageID);
end;


procedure DeinitializeSetup;
begin
 
Deinitialize;
  gdipShutDown;
  ButtonFont.Free;
  BASS_Stop();
  BASS_Free();
end;


Dinvin4ester 27-10-2013 16:49 2241985

saurn,
Спасибище вам от нуба.

Mat_y 28-10-2013 14:58 2242548

Ребят!
Как можно удалить файлы в папке в "AppData" перед установкой, если стоит галочка в секции [Tasks]...
...все дело в том, что секция [InstallDelete] совершенно не воспринимает...
Код:

Type: filesandordirs; Name: {userappdata}\Имя папки в которой надо все удалить\
Type: filesandordirs; Name: {commonappdata}\Имя папки в которой надо все удалить\
Type: filesandordirs; Name: {localappdata}\Имя папки в которой надо все удалить\

?

Mat_y 29-10-2013 00:08 2242909

Еще вопрос... есть такой скрипт, который копирует файлы из одной папку в другую (создает бэкап)
читать дальше »
Код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg
OutputDir=.

\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;



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

Cipso 29-10-2013 02:03 2242952

Привет!
Есть код
Код:

[_Cоde]
var
  CustomPage1: TWizardPage;
  Edit1: TNewEdit;
  Button1: TNewButton;

procedure Button1Click(Sender: TObject); forward;

procedure InitializeWizard();
begin
  CustomPage1 := CreateCustomPage(wpSelectDir, 'Caption', 'Description');

  Edit1 := TNewEdit.Create(WizardForm);
  with Edit1 do
  begin
    Parent := CustomPage1.Surface;
    Left := ScaleX(0);
    Top := ScaleY(68);
    Width := ScaleX(332);
    Height := ScaleY(21);
  end;

  Button1 := TNewButton.Create(WizardForm);
  with Button1 do
  begin
    Parent := CustomPage1.Surface;
    Left := ScaleX(342);
    Top := ScaleY(67);
    Width := ScaleX(75);
    Height := ScaleY(23);
    Caption := 'Button';
    OnClick := @Button1Click;
  end;
end;

procedure Button1Click(Sender: TObject);
begin

end;

Как сделать чтоб при нажатии кнопки Button, можно было выбрать папку а в TNewEdit выводился путь выбранной папки?
В выходе то что на странице CustomPage1 нужно чтоб все было тоже самое как на странице SelectDirPage, т.е через Button выбиралась папка, в TNewEdit выводился путь, только выбиралось это для записи в реестр, т.е при установке записывалось значение в реестр выбранной папки
Код:

Root: HKCU; SubKey: Software\Mini-Game\Game\Share paths; ValueType: string; ValueName: ShareFolder; ValueData: """{app}\Mini-Game\Game\"","; Flags: uninsdeletevalue uninsdeletekeyifempty

Антон_Мураткин@vk 29-10-2013 07:31 2242980

Всем доброе утро! Подскажите пожалуйста скрипт на установку dxwebsetup и vcredist_x86 Заранее благодарю.
З.Ы. Если можно то желательно можно было выбирать в меню и устанавливалось в конце установки перед нажатием кнопки завершить. Очень нужно, помогите пожалуйста!!!

Cipso 29-10-2013 11:31 2243096

Цитата:

Цитата Антон_Мураткин@vk
скрипт на установку dxwebsetup и vcredist_x86 »

Взято из примера

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

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить DirectX; Flags: unchecked
Name: Redist\VCCheck; Description: Установить Microsoft Visual C++ Redist; Flags: unchecked

[Run]
Filename: {src}\Redist\vcredist_x86.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ Redist...; Flags: skipifdoesntexist; Tasks: Redist\VCCheck
Filename: {src}\Redist\vcredist_x64.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ Redist...; Flags: skipifdoesntexist; Tasks: Redist\VCCheck
Filename: {src}\Redist\DirectX.exe; Parameters: /silent; StatusMsg: Обновляем DirectX...; Flags: skipifdoesntexist; Tasks: Redist\DirectXCheck


Mafia_forever 29-10-2013 18:15 2243384

Всем Привет . Я хочу обратиться вам за маленькой помощью , у меня есть файл compiledcode.bin , мне сказали что я могу извлечь этот код с помощью BinDump или же ISOFORCE , я не смог найти данные файлы (утилиты) нигде , решил обратиться сюда , может кто нибудь знает как найти эти так сказать утилиты , если да то дать прямую ссылку на скачивание. Заранее спасибо за внимание :-)

Антон_Мураткин@vk 29-10-2013 18:18 2243385

Cipso, Так этот код мне не даёт что именно мне надо.

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

А мне надо как у репакеров это делается. Кто знает подскажите :(

Nordek 29-10-2013 19:20 2243411

Цитата:

Цитата Антон_Мураткин@vk
Так этот код мне не даёт что именно мне надо. »

Антон_Мураткин@vk, Чем ответ от Cipso не угодил?
Так используй IStool, Inno Script Studio, InnoIDE, они умеют это делать.

Вот через IStool накидал
Код:

[Tasks]
Name: a; Description: Дополнительно
Name: a/dx; Description: DirectX
Name: a/vc; Description: Visual C++

[Run]
Filename: {src}\vcredist.exe; Parameters: /q; StatusMsg: Установка Visual C++; Tasks: a/vc
Filename: {src}\DirectX.exe; Parameters: /silent; StatusMsg: Установка DirectX; Tasks: a/dx

Могу ещё десяток таких набить.

Цитата:

Цитата Антон_Мураткин@vk
всё равно устанавливаются автоматом. »

А ты действительно уверен в том что установка происходит?
Заметь, там присутствует флаг skipifdoesntexist
Код:

Flags: skipifdoesntexist;
который в случае отсутствия файла, пропускает его выполнение т.е в таком случае не выводит предупреждение о том что файл не существует.


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

{src} - Внешний путь.

Если у тебя например так
Код:

[Run]
Filename: {src}\vcredist.exe
Filename: {src}\DirectX.exe

то это означает что твои DirectX и Visual C++ должны находиться рядом с инсталлятором.

если например так
Код:

[Run]
Filename: {src}\Моя_Папка\vcredist.exe
Filename: {src}\Моя_Папка\DirectX.exe

то это означает что рядом с инсталлятором должна быть создана папка с названием "Моя_Папка" а в ней твои DirectX и Visual C++.




[Tasks] - Это задача

В задачах обрати внимание на Name
в Name должно быть буквенное или буквенно-числовое обозначение

Код:


[Tasks]
Name: a/ab
Name: a/ac

т.е если нужно чтоб происходило выполнение в зависимости от выбранной задачи, то в [Run] в Filename должен присутствовать Tasks: с буквенным или буквенно-числовым обозначением в зависимости от того что прописанного в [Tasks]

Код:


[Run]
Filename: {src}\vcredist.exe; Tasks: a/ab
Filename: {src}\DirectX.exe;  Tasks: a/ac


Description - Это описание/название компонента

Код:


[Tasks]
Name: a/ab; Description: Это мой DirectX
Name: a/ac; Description: Это мой Visual C++


Cipso 30-10-2013 12:24 2243749

Цитата:

Цитата Cipso (Сообщение 2242952)
Как сделать

Помогите решить

El Sanchez 30-10-2013 18:28 2244043

Цитата:

Цитата Cipso
Как сделать чтоб при нажатии кнопки Button, можно было выбрать папку а в TNewEdit выводился путь выбранной папки? »

Cipso,
Код:

procedure BrowseButton(Sender: TObject);
var
   
szDir: String;
begin
    if
BrowseForFolder('', szDir, True) then Edit1.Text := szDir;
end;

Цитата:

Цитата Cipso
через Button выбиралась папка, в TNewEdit выводился путь, только выбиралось это для записи в реестр, т.е при установке записывалось значение в реестр выбранной папки »

Cipso,
Код:

[Registry]
Root: HKCU; SubKey: Software\Mini-Game\Game\Share paths; ValueType: string; ValueName: ShareFolder; ValueData: {code:SetValueData|}; Flags: uninsdeletevalue uninsdeletekeyifempty

[code]
function SetValueData(Param: String): String;
begin
   
Result := Format('"%s\,"', [Edit1.Text]);
end;


Cipso 30-10-2013 19:59 2244105

Цитата:

Цитата El Sanchez
Код: »

Огромное спасибо! Очень выручили.
Вопрос, получается полный код будет таким
Код:

[Registry]
Root: HKCU; SubKey: Software\Mini-Game\Game\Share paths; ValueType: string; ValueName: ShareFolder; ValueData: {code:SetValueData|}; Flags: uninsdeletevalue uninsdeletekeyifempty

[_Code]
var
  CustomPage1: TWizardPage;
  Edit1: TNewEdit;
  Button1: TNewButton;
  szDir: String;

procedure BrowseButton(Sender: TObject); forward;

   
procedure InitializeWizard();
begin
  CustomPage1 := CreateCustomPage(wpSelectDir, 'Caption', 'Description');

  Edit1 := TNewEdit.Create(WizardForm);
  with Edit1 do
  begin
    Parent := CustomPage1.Surface;
    Left := ScaleX(0);
    Top := ScaleY(68);
    Width := ScaleX(332);
    Height := ScaleY(21);
  end;

  Button1 := TNewButton.Create(WizardForm);
  with Button1 do
  begin
    Parent := CustomPage1.Surface;
    Left := ScaleX(342);
    Top := ScaleY(67);
    Width := ScaleX(75);
    Height := ScaleY(23);
    Caption := 'Button';
    OnClick := @BrowseButton;
  end;
end;

procedure BrowseButton(Sender: TObject);
begin
    if BrowseForFolder('', szDir, True) then Edit1.Text := szDir;
end;

function SetValueData(Param: String): String;
begin
    Result := Format('"%s\,"', [Edit1.Text]);
end;

???

Все верно я вставил?

tuz-veta 30-10-2013 22:53 2244226

ребята подскажите как добавить кнопки вот здесь


Mat_y 01-11-2013 13:39 2245361

Есть вопрос:

В теме уже научился создавать описание и картинку при наведении мышки на компонент... а можно ли воспроизводить звуки при наведении на некоторые компоненты?

alexxxdar@vk 01-11-2013 15:06 2245412

Уважаемые форумчане! Очень нужна ваша помощь...
Я разработчик Mod Pack Alexxx-DAR для игры World Of Tanks!
У меня есть несколько вопросов... Помогите кто знает!

01. Как сделать так, чтобы мой установщик автоматически находил местоположение игры, тоесть сам прописывал путь к папке World Of Tanks ???
02. Как сделать так, чтобы установщик копировал папку audio из папки World Of Tanks/res в папку World Of Tanks/res_mods/0.8.9 ???
03. Как сделать так, чтобы в окне выбора модов, при наведение на какой либо мод, высвечивалось описание мода и маленький скриншот ???
04. Как сделать так чтобы установщик автоматически очищал папку res_mods ???
05. Как сделать так, чтобы при запуске установщика открывалось окно с описанием мод-пака (По умолчанию у меня открывается "Вас приветствует мастер установки", Далее открывается "Выберите папку с игрой") Как между ними вставить окно с описанием модов ???

Подобные установщики есть у таких мододелов как Jove: http://www.youtube.com/watch?v=5RfUHG5Ptxc
и ExPromt: http://www.youtube.com/watch?v=ikVnr8r6ELs#t=147

Мой же установщик, который мне нужно доработать можно скачать и посмотреть отсюда: http://yadi.sk/d/aJ4UyBdRBsauc

Shkutu 01-11-2013 20:03 2245603

Всем доброго времени суток!
Подскажите плиз, а можно на форме типа TInputQueryWizardPage добавленное текстовое поле сделать недоступным для редактирования? Или для этого свою форму рисовать придется?

nik1967 01-11-2013 21:06 2245627

Shkutu, ну у TInputQueryWizardPage есть свойство Edits[Index: Integer]: TPasswordEdit, у которого, в свою очередь, есть свойство ReadOnly: Boolean - только чтение. Вроде так.

ATTACUE 02-11-2013 22:02 2246313

Доброго времени суток.
Взял код авторана на Inno Setup отсюда
читать дальше »
сообщение от Gnom_aka_Lexander, сцитировать не могу, так как тема закрыта

Добавил секцию [CustomMessages] на два языка - rus и eng.
Секция [Languages] соответственно тоже имеется.
В секции [code] подписи имен файлов (Caption) через cm:MyButtomName тоже сделал.
Проблема в следующем:
Хочу добавить две кнопки - rus и eng, чтобы по их нажатию интерфейс переключался на русский и английский соответственно.
То есть реализация ShowLanguageDialog=yes, только через кнопки
или хотя бы как изменить текст, который отображается при выборе языка установки:
Выберите язык, который будет использован в процессе установки
На просто - выберите язык, так как по крайней мере реализация через ShowLanguageDialog работает, но выглядит не совсем так, как хотелось.
читать дальше »
Код:

procedure EngButtonClick(Sender: TObject);
begin
// голову сломал, не знаю как реализовать
end;


Кто что посоветует?

ATTACUE 02-11-2013 22:56 2246324

alexxxdar@vk,

1) через реестр
[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Название_Игры,InstallPath}
Только заранее свои ключи к игре проверить

2) Как-то так (если я правильно понял)
[Files]
Source: "Audio\Звуковой_файл_1.wav"; DestDir: "{app}\Папка_Куда_Копируем\"; DestName: "Новое_имя_1.wav";
Можно DestName (переименование) не использовать

3) не знаю

4) в секции [code] нужно как-то применить следующее, как именно не знаю, но копать отсюда:
RemoveDir(ExpandConstant('{app}\Название_удаляемой_папки'));

5) Можно само описание добавить как-то так:
[Setup]
InfoBeforeFile=info.txt
Рядом со скриптом создается info.txt и в нем пишется все, что душе угодно, в процессе установки высвечивается.

Иных способов в голову не приходит. Надеюсь помог)

nik1967 03-11-2013 03:37 2246421

Цитата:

Цитата ATTACUE
или хотя бы как изменить текст, который отображается при выборе языка установки:
Выберите язык, который будет использован в процессе установки »

пример
Код:

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
ShowLanguageDialog=yes

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

[Messages]
; Русский
rus.SelectLanguageTitle=Выберите язык
rus.SelectLanguageLabel=Выберите язык:

; English
eng.SelectLanguageTitle=Select language
eng.SelectLanguageLabel=Select language:

Цитата:

Цитата ATTACUE
Хочу добавить две кнопки - rus и eng, чтобы по их нажатию интерфейс переключался на русский и английский соответственно. »

пример
Код:

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
ShowLanguageDialog=auto

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

[CustomMessages]
; Русский
rusButtonBack=< &Назад
rusButtonNext=&Далее >
rusButtonCancel=Отмена
rusSetupWindowTitle=Установка — %1
rusWelcomeLabel1=Вас приветствует Мастер установки %1
rusWelcomeLabel2=Программа установит %1, версия %2 на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.%n%nНажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

; English
engButtonBack=< &Back
engButtonNext=&Next >
engButtonCancel=Cancel
engSetupWindowTitle=Setup — %1
engWelcomeLabel1=Welcome to the %1 Setup Wizard
engWelcomeLabel2=This will install %1 version %2 on your computer.%n%nIt is recommended that you close all other applications before continuing.%n%nClick Next to continue, or Cancel to exit Setup.

[ Code]
var
  lang: String;
  langBtn: TButton;

procedure ChangeLang();
begin
  WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
  WizardForm.NextButton.Caption:= CustomMessage(lang+'ButtonNext');
  WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
  WizardForm.Caption:= FmtMessage(CustomMessage(lang+'SetupWindowTitle'), ['{#SetupSetting('AppName')}']);
  WizardForm.WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
  WizardForm.WelcomeLabel2.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel2'), ['{#SetupSetting('AppName')}', '{#SetupSetting('AppVersion')}']);
end;

procedure LangBtnClick(Sender: TObject);
begin
  if lang='rus' then begin
    lang:= 'eng';
    langBtn.Caption:= 'рус';
  end else begin
    lang:= 'rus';
    langBtn.Caption:= 'eng';
  end;
  ChangeLang();
end;

procedure InitializeWizard;
begin
  langBtn:= TButton.Create(WizardForm);
  with langBtn do begin
    SetBounds(10,WizardForm.CancelButton.Top,30,WizardForm.CancelButton.Height)
    OnClick:= @LangBtnClick;
    Parent:= WizardForm;
  end;

  if ActiveLanguage='rus' then begin
    lang:= 'rus';
    langBtn.Caption:= 'eng';
  end else begin
    lang:= 'eng';
    langBtn.Caption:= 'рус';
  end;
end;


ToBeLife 03-11-2013 18:29 2246676

Доброго времени. Подскажите, как можно реализовать отображение (не выбор) компонентов в зависимости от выбранного языка т.е. если выбираю английский то у меня три определённых компонента из которых могу выбрать, если другой язык, то отображаются другие компоненты.

Dinvin4ester 04-11-2013 00:49 2246916

Ребята есть скрипт - http://sendfile.su/886094 . Писал ранее , мне ответили , но у меня не получилось . В чем проблема- не получается прописать выборочную установку . Надо чтобы напротив установки ПО по умолчанию ставилась галка,т.е. была выборочная установка и полная.

ATTACUE 04-11-2013 16:12 2247237

Доброго времени суток.
читать дальше »
nik1967, спасибо за помощь

Возникла весьма специфичная проблема.
Часто для установки дополнительных фишек в папку с программой делал так.
Код:

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Название_приложения,InstallPath}

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

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Название_приложения,InstallPath}\папка_1\внутренняя папка

то после установки приложения, значение в реестре основной программы
{reg:HKLM\SOFTWARE\Название_приложения,InstallPath}
меняется на {reg:HKLM\SOFTWARE\Название_приложения\папка_1\внутренняя папка,InstallPath}
и это моем случае очень здорово напрягает.

Не помогает и запись такого вида:
Код:

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Название_приложения,InstallPath|{pf}\папка_1\внутренняя папка}

или
Код:

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Название_приложения,InstallPath|папка_1\внутренняя папка}

Секция [registry] имеется, выставлены отличные от основной программы значения типа:
Код:

Root: HKLM; Subkey: "Другое_название_приложения"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Flags: uninsdeletekey
Тем не менее - в {reg:HKLM\SOFTWARE\Название_приложения,InstallPath} значения все равно меняются.

Как мне заблокировать изменение инсталлятором именно этой ветки:
{reg:HKLM\SOFTWARE\Название_приложения,InstallPath}
чтобы она для инсталлятора была как бы "только для чтения"

Optitron 04-11-2013 18:54 2247332

Подскажите плиз, как сделать так, чтобы при выборе 2 компонентов (Flags: exlusive):
1) при выборе 1 компонента создавался деинсталлятор
2) при выборе 2 компонентов не создавался деинсталлятор.
Если нельзя через компоненты сделать, то может быть через Tasks можно.
Заранее Спасибо!

alexxxdar@vk 04-11-2013 19:28 2247356

ATTACUE

01. Но я не могу найти игру в реестре по пути reg:HKLM\SOFTWARE\ (Там нет папки World_Of_Tanks)

02. Ты меня не понял, у меня уже установленная игра World_Of_Tanks. В ней есть папка Audio, она лежит в папке res. Мне нужно чтоб установщик скопировал эту папку из папки res в папку res_mods, то есть как-то так:
[Files]
Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods"; Flags: recursesubdirs

03. Команда RemoveDir(ExpandConstant('{app}\res_mods')); мне нравится только куда её вставить хз

ATTACUE 04-11-2013 20:36 2247400

alexxxdar@vk,

01. Если устанавливал, должна быть, только вот она может называться по-другому, (это нужно учитывать)
если честно - даже и не знаю как называется она, так как не играю в танки.
Как вариант - ветка HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Всякие_папки
и просмотреть их, если конечно система 64-битная.
Тем не менее все равно в скрипте указывается без Wow6432Node, так как если приложение 32-битное, оно (вроде бы как)
скопируется, по крайней мере у меня значения проверяет корректно.
Если игра представляет собой архив без установочника, то в этом случае в реестре ты не найдешь нужные тебе ключи.

02. и 03. Поискав по форуму, наткнулся на это, там есть пара примеров, которые ты можешь приспособить под себя

alexxxdar@vk 05-11-2013 02:35 2247574

ATTACUE,

Спасибо за помощь! Что-то я прочитал документ который ты мне скинул, нашел пару функций которые мне нужно, но нифига не получается... Копирую нужные коды в раздел [code] прописываю свои пути и ничего не работает, или вообще ошибки выбивает при компиляции, кароче я в этом ничего не понимаю...

ATTACUE 05-11-2013 14:30 2247868

alexxxdar@vk,
Большинство ошибок при компиляции - очевидны, посмотри на них.
Возможно просто отсутствует знак ";"
или продублирован идентификатор
или какая-то функция не прописана в начале секции [code].
Если используешь сторонние или ранее написанные скрипты как модули - ошибки могут быть и в них,
и в этом случае в ошибке прописывается - какой модуль и путь до него.
Попробуй немного разобраться с кодом в примерах. Знаю - это сложно, но возможно тогда ты увидишь и поймешь свои ошибки.
В настройках Inno Setup включи отображение номеров строк - проще будет ориентироваться по коду.
А еще лучше - используй Inno Setup отсюда.
Я бы рад бы тебе помочь с твоим скриптом, посидеть на досуге и просмотреть, но у меня не так много времени на свой скрипт, который я допиливаю, и который занимает все мое свободное время.
Посмотри этот документ или на этой странице тоже есть интересные примеры (например Бекап файлов).
Уверен - они тебе не раз помогут.
К сожалению больше ни чем конструктивным помочь я не смогу.

alexxxdar@vk 05-11-2013 15:32 2247911

ATTACUE,

Уже вроде как получилось!
Посмотри, правильный код?
Это код на то чтоб перед установкой чистилась папка, копировалось туда нужные мне файлы а после удаления удалялось всё...

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
if DirExists(ExpandConstant('{app}\res_mods')) then
DelTree(ExpandConstant('{app}\res_mods'), True, True, True);
end;
begin
CopyDir(ExpandConstant('{app}\res\audio'),ExpandConstant('{app}\res_mods\0.8.9'));
end;
begin
CopyDir(ExpandConstant('{app}\res\text'),ExpandConstant('{app}\res_mods\0.8.9'));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
DelTree(ExpandConstant('{app}\res_mods\0.8.9\audio'), True, True, True);
end;
begin
DelTree(ExpandConstant('{app}\res_mods\0.8.9\text'), True, True, True);
end;
end;

И спасибо Большое! Реально помог))

nik1967 05-11-2013 16:57 2247966

alexxxdar@vk, слишком много бегинов и эндов. Куда столько?
можно проще :)
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then begin
    if DirExists(ExpandConstant('{app}\res_mods')) then begin
      DelTree(ExpandConstant('{app}\res_mods'), True, True, True);
      CopyDir(ExpandConstant('{app}\res\audio'),ExpandConstant('{app}\res_mods\0.8.9'));
      CopyDir(ExpandConstant('{app}\res\text'),ExpandConstant('{app}\res_mods\0.8.9'));
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then begin
    DelTree(ExpandConstant('{app}\res_mods\0.8.9\audio'), True, True, True);
    DelTree(ExpandConstant('{app}\res_mods\0.8.9\text'), True, True, True);
  end;
end;


alexxxdar@vk 05-11-2013 17:15 2247976

nik1967,

Работает! Только возникает 2 вопроса:

01. Почему установщик копирует папку с файлами audio в {app}\res_mods\0.8.9 и также содержимое папки audio в {app}\res_mods\0.8.9

А без кода DelTree(ExpandConstant('{app}\res_mods'), True, True, True); всё нормально! В чём может быть проблема?

begin
if CurStep = ssInstall then begin
if DirExists(ExpandConstant('{app}\res_mods')) then begin
DelTree(ExpandConstant('{app}\res_mods'), True, True, True);
CopyDir(ExpandConstant('{app}\res\audio'),ExpandConstant('{app}\res_mods\0.8.9'));
CopyDir(ExpandConstant('{app}\res\text'),ExpandConstant('{app}\res_mods\0.8.9'));
end;
end;
end;

02. Почему установщик копирует папку и перед установкой, и после, что мешает установить файлы из секции [Files] ?

[Files]
Source: "E:\Игры Install\WOT\Mod Pack\Install_mods\Mods\audio\6_chuvstv\sirena1\*"; DestDir: "{app}"; Components: A\audio\6_chuvstv\sirena1; Flags: recursesubdirs

[code]

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
if DirExists(ExpandConstant('{app}\res_mods')) then begin
DelTree(ExpandConstant('{app}\res_mods'), True, True, True);
CopyDir(ExpandConstant('{app}\res\audio'),ExpandConstant('{app}\res_mods\0.8.9'));
CopyDir(ExpandConstant('{app}\res\text'),ExpandConstant('{app}\res_mods\0.8.9'));
end;
end;
end;

Nightwishh 05-11-2013 21:30 2248133

Здавствуйте! Хочу спросить, можно ли в ISDone заменить процедуру
Код:

procedure CreateControls();
которая обрабатывается процедурой
Код:

procedure CurStepChanged(CurStep: TSetupStep);
на
Код:

InitializeWizard();
? Просто через последнюю процедуру инсталл не залипает в самом начале установки.

Антон_Мураткин@vk 06-11-2013 08:05 2248321

ВСем доброе утро. Подскажите скрипт на удаление игры программы и т.п. Стандартный не работает почему то! пишет вот такую штуку

или такую


Подскажите плиз как это всё исправить

Nordek 07-11-2013 07:44 2248968

Цитата:

Цитата Антон_Мураткин@vk
Подскажите скрипт на удаление игры программы и т.п. »

"Вы чё ребята, издеваетесь? Тему не судьба почитать?"

Антон_Мураткин@vk, Смотри сюда или не катит!?

От некоторых проблем избавит расширенная версия инно.

Антон_Мураткин@vk 07-11-2013 08:28 2248987

Nordek, Это не то. Мне надо что бы просто удалялась папка с игрой прогой или файлы в папке

И у меня стоит раширенная версия уже.

А читать тему много букв уж слишком да и подходящего видать и нет

Nordek 07-11-2013 09:56 2249036

Цитата:

Цитата Антон_Мураткин@vk
Мне надо что бы просто удалялась папка с игрой прогой или файлы в папке »


Самый простой способ и без заморочек, использовать секцию [UninstallDelete] - Удаление при деинсталляции:
Код:


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

В Type указываешь то что тебе необходимо удалить:
Код:

filesandordirs - Удаляет "Файлы и/или каталоги".
files          - Удаляет "Файлы" в каталоге
dirifempty    - Удаляет "Каталог в том случае, если он пустой"

Если же нужно удалить перед установкой, то используй секцию [InstallDelete].

nik1967 07-11-2013 12:35 2249145

Антон_Мураткин@vk, а ты случайно в инсталл не пакуешь unins000.dat и (или) unins000.exe? Что то похоже на то.

Optitron 07-11-2013 19:40 2249437

Подскажите пожалуйста, как изменить в инсталляторе порядок страниц мастера установки. Например: Выбор папки в меню пуск стоял перед перед выбором пути установки.

Nordek 08-11-2013 00:24 2249708

Цитата:

Цитата Optitron
Например: Выбор папки в меню пуск стоял перед перед выбором пути установки. »

Код:

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

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

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[Files]
Source:compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Messages]
russian.WizardSelectProgramGroup=Выбор папки установки
default.WizardSelectProgramGroup=Select Destination Location
russian.SelectStartMenuFolderDesc=В какую папку вы хотите установить [name]?
default.SelectStartMenuFolderDesc=Where should [name] be installed?
russian.WizardSelectDir=Выберите папку в меню «Пуск»
default.WizardSelectDir=Select Start Menu Folder
russian.SelectDirDesc=Где программа установки должна создать ярлыки?
default.SelectDirDesc=Where should Setup place the program's shortcuts?

[Code]
procedure InitializeWizard();
begin
WizardForm.SelectDirBitmapImage.Parent := WizardForm.SelectProgramGroupPage;
WizardForm.SelectDirLabel.Parent := WizardForm.SelectProgramGroupPage;
WizardForm.SelectDirBrowseLabel.Parent := WizardForm.SelectProgramGroupPage;
WizardForm.DirEdit.Parent := WizardForm.SelectProgramGroupPage;
WizardForm.DirBrowseButton.Parent := WizardForm.SelectProgramGroupPage;
WizardForm.DiskSpaceLabel.Parent := WizardForm.SelectProgramGroupPage;
WizardForm.SelectGroupBitmapImage.Parent := WizardForm.SelectDirPage;
WizardForm.SelectStartMenuFolderLabel.Parent := WizardForm.SelectDirPage;
WizardForm.SelectStartMenuFolderBrowseLabel.Parent := WizardForm.SelectDirPage;
WizardForm.GroupEdit.Parent := WizardForm.SelectDirPage;
WizardForm.GroupBrowseButton.Parent := WizardForm.SelectDirPage;
WizardForm.NoIconsCheck.Parent := WizardForm.SelectDirPage;
end;

Меняй то что находится в InnerNotebook, я к тому что трогать MainPanel не нужно.
За перемещение в InnerNotebook отвечает Parent :=
А для изменения описаний те что находятся в MainPanel, достаточно переставить их местами в секции [Messages].

Антон_Мураткин@vk 08-11-2013 13:09 2249953

Цитата:

Цитата nik1967
Антон_Мураткин@vk, а ты случайно в инсталл не пакуешь unins000.dat и (или) unins000.exe? Что то похоже на то. »

Нет не покую его

Nordek, А куда лучше это вписывать? перед какой секцией

Optitron 08-11-2013 21:11 2250280

Nordek, Благодарю за ответ!
Есть ещё вопрос, при наличии 5 exclusive компонентов каждый раз при запуске инсталлятора по умолчанию ставится рандомный компонент, можно как-нибудь это исправить? Чтобы по умолчанию всегда был 1 компонент из списка.

ATTACUE 08-11-2013 21:24 2250287

alexxxdar@vk,
Не за что))
Пардон за поздний ответ.
Если в секции [files] фигурируют папка audio, которая тебе нужна - // закомментируй эту строчку
Оставь только то, что было у тебя в секции [code]

Если оформлять копирование через секцию [files], то если я не ошибаюсь, то ее нужно связывать как-то с секцией [tasks]
и в этом случае в секции [code] нужно закомментировать те задачи, которые выполняет [tasks].
Опять же - я могу и ошибаться, так как я далеко не профи.

Если удаляешь файлы через секцию [unistalldelete] то файлы прописываются именно в этой секции,
выглядит это как-то так
Type: files; Name: "{app}\папка_0\папка_1\папка_2\file_1.mp3";
Type: files; Name: "{app}\папка_0\папка_1\file_1.mp3";
Type: files; Name: "{app}\папка_0\file_1.mp3";
проверка на наличие пустых папок осуществляется в [code]
с помощью RemoveDir
(то есть это даже не проверка, но удаляет папку, если она пустая и это иногда бывает необходимо)
(DelTree более "беспощадная")

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
// RemoveDir удалит только, если папка пустая
// Порядок удаление определен ниже:
// Папка 2
RemoveDir(ExpandConstant('{app}\папка_0\папка_1\папка_2'));
// папка 1
RemoveDir(ExpandConstant('{app}\папка_0\папка_1\'));
// Главная папка (папка_0)
RemoveDir(ExpandConstant('{app}\папка_0\'));
end;
end;

Nordek 08-11-2013 23:05 2250358

Цитата:

Цитата Антон_Мураткин@vk
А куда лучше это вписывать? »

Вот примеры:

С удалением перед установкой
Код:

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

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

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[Files]
Source:compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

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

С удалением при деинсталляции
Код:

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

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

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[Files]
Source:compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

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

С удалением удалением перед установкой и удалением при деинсталляции
Код:

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

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

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[Files]
Source:compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

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

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

Удаление при деинсталляции (Типы):

Код:

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

Код:

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

Код:

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

Удаление перед установкой (Типы):

Код:

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

Код:

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

Код:

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


Nordek 10-11-2013 04:57 2251071

Цитата:

Цитата Optitron
Чтобы по умолчанию всегда был 1 компонент из списка. »

Так например
Код:

[Components]
Name: a; Description: A; Flags: exclusive; Types: custom compact full
Name: b; Description: B; Flags: exclusive
Name: c; Description: C; Flags: exclusive
Name: d; Description: D; Flags: exclusive


Optitron 10-11-2013 08:28 2251093

Nordek, Спасибо за ответ, но можно как-нибудь в этом случае сделать так, чтобы секция Types в инсталляторе не была видна (т.е. без Полная, Выборочная, Компактная установка)?

Nordek 10-11-2013 11:55 2251142

Цитата:

Цитата Optitron
чтобы секция Types в инсталляторе не была видна »

Тут был уже пример несколько страниц назад. Не только я давал.

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

[Components]
Name: a; Description: A; Flags: exclusive; Types: custom compact full
Name: b; Description: B; Flags: exclusive
Name: c; Description: C; Flags: exclusive
Name: d; Description: D; Flags: exclusive

[Code]
procedure InitializeWizard();
begin
 
WizardForm.ComponentsList.Top := ScaleY(45);
  WizardForm.ComponentsList.Height := ScaleY(160);
  WizardForm.TypesCombo.Visible := False;
end;


Dinvin4ester 10-11-2013 22:13 2251583

Вложений: 4
Привет всем . Ребята есть скрипт механиков - http://rghost.ru/49046726 . Реально ли его переделать вот так , как на скринах ?

Shkutu 11-11-2013 13:11 2251924

nik1967, спасибо!

Dinvin4ester 12-11-2013 01:35 2252488

Сам пробовал , но все равно остаются эти полосы черные , а как на скриншотах не получается .

Aquila 14-11-2013 16:06 2254503


Скачал справку отсюда, ничего не показывает, нашёл даже поновей от тех же авторов, тоже не фурычит, помогите! Или чем ещё можно открыть?

nik1967 14-11-2013 16:28 2254525

Aquila, писали уже не раз. Правой кнопкой на файл справки=>Свойства=>Разблокировать

Mat_y 14-11-2013 16:35 2254529

Ребят, чего ругается?


Разобрался... лечится
Код:

DiskSpanning=true

Uga4aka 15-11-2013 08:37 2254972

Есть инсталлятор ПО, но без исходников. И его необходимо дополнить. После распаковки инсталлятора, получил исходники. Насколько разобрался, в нем происходит копирование файлов при определенных условиях (версия ОС). Проверка идет командой Check, но самой функции в коде нет
фрагмент проблемного кода

Source: "{pf}\UltraVNC\ultravnc,1.ini"; DestDir: "{pf}\UltraVNC"; DestName: "ultravnc.ini"
Source: "{pf}\UltraVNC\ultravnc_64.ini"; DestDir: "{pf}\UltraVNC"
Source: "{pf}\UltraVNC\vnchooks.dll"; DestDir: "{pf}\UltraVNC"
Source: "{pf}\UltraVNC\winvnc,1.exe"; DestDir: "{pf}\UltraVNC"; DestName: "winvnc.exe"
Source: "{pf}\UltraVNC\winvnc_ru.exe"; DestDir: "{pf}\UltraVNC"
Source: "{pf}\UltraVNC\winvnc,2.exe"; DestDir: "{pf}\UltraVNC"; DestName: "winvnc.exe"Check: "isVista() or isWin2008Server() or iswin7() or iswin8()"
Source: "{pf}\UltraVNC\winvnc-108.exe"; DestDir: "{pf}\UltraVNC"Check: "isVista() or isWin2008Server() or iswin7()"
Source: "{pf}\UltraVNC\winvnc-108_ru.exe"; DestDir: "{pf}\UltraVNC"; Check: "isVista() or isWin2008Server() or iswin7()"
Source: "{pf}\UltraVNC\ultravnc,2.ini"; DestDir: "{pf}\UltraVNC"; DestName: "ultravnc.ini"; Check: "isWin64()"

не подскажете как дописать, что бы все работало.
Нашел что есть GetWindowsVersion, GetWindowsVersionEx. Но как прикрутить их в скрипт, не хватает навыков

Raz3r 15-11-2013 09:26 2254998

Подскажите пожалуйста. Везде обыскал, но так и не нашел. Как сделать, чтобы в меню выбора пути установки путь отображался, но его нельзя было бы изменить? Желательно, чтобы можно было только кнопкой обзор изменить.

Mat_y 15-11-2013 10:44 2255058

Ребят, кто может помочь удалить из этого кода страницу с выбором компонентов. Сыпет ошибки и сыпет.

Nordek 15-11-2013 11:39 2255084

Цитата:

Цитата Raz3r
Как сделать, чтобы в меню выбора пути установки путь отображался, но его нельзя было бы изменить? »

Код:

[Code]
procedure InitializeWizard();
begin
 
WizardForm.DirEdit.Enabled := False;
end;


Uga4aka 15-11-2013 12:09 2255119

Цитата:

Цитата Uga4aka
Есть инсталлятор ПО, но без исходников. И его необходимо дополнить. После распаковки инсталлятора, получил исходники. Насколько разобрался, в нем происходит копирование файлов при определенных условиях (версия ОС). Проверка идет командой Check, но самой функции в коде нет
фрагмент проблемного кода
не подскажете как дописать, что бы все работало.
Нашел что есть GetWindowsVersion, GetWindowsVersionEx. Но как прикрутить их в скрипт, не хватает навыков »

решение
function IsVista: Boolean;
{function to check if we are running on Windows Vista}
var
version: TWindowsVersion;
begin
GetWindowsVersionEx(version);
result := false;
if Version.NTPlatform and
(Version.Major = 6) then
result := true;
end;

function IsXP: Boolean;
{function to check if we are running on Windows XP}
var
version: TWindowsVersion;
begin
GetWindowsVersionEx(version);
result := false;
if Version.NTPlatform and
(Version.Major = 5) and
(Version.Minor = 1) then
result := true;
end;

function Is2000: Boolean;
{function to check if we are running on Windows 2000}
var
version: TWindowsVersion;
begin
GetWindowsVersionEx(version);
result := false;
if Version.NTPlatform and
(Version.Major = 5) and
(Version.Minor = 0) then
result := true;
end;
function IsServer: Boolean;
{function to check if we are running on a server}
var
version: TWindowsVersion;
begin
GetWindowsVersionEx(version);
result := false;
if Version.ProductType = VER_NT_SERVER then
result := true;
end;

FX-DENIS 15-11-2013 14:25 2255210

Здравствуйте знатоки форума,давно я у вас не просил помощи,El Sanchez помню и SEREGA помню.Проблема вот в чем,у меня скрипт которым я сжимал файлы средствами самого инно мне его Serega подредактировал,я пользовался им полтора года (за что поклон Serege),а тут решил попробовать Free Arc,извлечение из рядом лежащего файла.Все сделал по инструкции вроде,и скачал с сайта библиотеки, но инно ругается на многое,компилирую в Unicod версии.Даже если ошибочные строки закоментировать,то вылазит ошибка такая

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

FX-DENIS 15-11-2013 14:29 2255212

Вложений: 1
Вот сам скрипт,потому что текстом не влез,более 33тыс символов Файл 106841

Shkutu 15-11-2013 14:36 2255215

Приветствую!
Подскажите плиз, разве в инно в [code] нельзя объявлять классы? Например пытаюсь сделать
Код:

type
TBackUpButton = class(TNewButton)
  property order: integer; read write;
  property connstring: string; read write;
 end;

Ругается на "identifier expected". Причем другие типы (на основе record например) объявляются без проблем.

tuz-veta 16-11-2013 16:44 2255901

Привет всем!
подскажите как добавить 2 кнопки для перехода на сайт
вот в этих местах?

Nordek 16-11-2013 18:27 2255966

Цитата:

Цитата tuz-veta
подскажите как добавить 2 кнопки для перехода на сайт
вот в этих местах?
»

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

[Code]
var
  ClkSite1: TNewButton;
  ClkSite2: TNewButton;
  ErrorCode : Integer;

procedure URLClk1Click(Sender: TObject); forward;
procedure URLClk2Click(Sender: TObject); forward;

procedure InitializeWizard();
begin
  ClkSite1 := TNewButton.Create(WizardForm);
  with ClkSite1 do
  begin
   
Parent := WizardForm.WelcomePage;
    Left := ScaleX(80);
    Top := ScaleY(216);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Сайт 1';
    OnClick := @URLClk1Click;
  end;

  ClkSite2 := TNewButton.Create(WizardForm);
  with ClkSite2 do
  begin

    Parent := WizardForm.WelcomePage;
    Left := ScaleX(336);
    Top := ScaleY(216);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Сайт 2';
    OnClick := @URLClk2Click;
  end;
end;

procedure URLClk1Click(Sender: TObject);
begin
  ShellExec('open', 'http://www.ссылканасайт.com/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure URLClk2Click(Sender: TObject);
begin
 ShellExec('open', 'http://www.ссылканасайт.com/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;


tuz-veta 16-11-2013 18:52 2255991

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

Nordek 16-11-2013 19:32 2256013

Цитата:

Цитата tuz-veta
но у меня не получается прикрутить к моему скрипту »

Я угадать должен, в какое место тебе нужно его засунуть?

tuz-veta 16-11-2013 20:20 2256045

Вложений: 1
Nordek,
забыл что не выложил скрипт
вот скрипт

Nordek 16-11-2013 20:37 2256055

tuz-veta, Пробуй

tuz-veta 16-11-2013 21:08 2256072

Цитата:

Цитата Nordek
tuz-veta, Пробуй »

выдает ошибку

tuz-veta,
может все скинуть чтоб Вы посмотрели?

Nordek 16-11-2013 21:42 2256102

tuz-veta, Перезалил, пост выше.

tuz-veta 16-11-2013 21:53 2256117

Nordek,
Спасибо Вам огромное!!! :clapping: :clapping: :clapping:
Все работает. :up

Johny777 17-11-2013 01:37 2256261

Shkutu, нет, возможности языка урезаны. Классы и наследникив писать нельзя (даже исходный код их методов и свойств изнутри инно закрыт. Только если исходники самой инно смотреть, в чём я например не вижу смысла, когда есть внешние библиотеки типа "Classes.pas" того же RadStudioXE(2,3, 4(?))), интерфейсы вроде можно писать в юникодной версии инно (о чём говорит код из шапки "Установка гаджета в Windows 7")
Тип указатель и прилагающиеся к нему функции типа Allocate..., ReAllocate..., Dispose..., ..., CopyMemory отсутствуют, хотя с этим можно в некоторой мере работать(WinApi), но это уже другой вопрос
а записи (record) - сколько угодно! :)

FX-DENIS 17-11-2013 09:29 2256310

Johny777 привет,тебя тоже вспомнил,ты мне помогал когда был новичком тут.Может ты сможешь мне помочь,проблема на прошлой странице.Версия инно 5.5.1ее2 (u),пробовал в стандартной 5.5.4 (u) ,может ошибка такая связанна с инно или библиотеками?

Dinvin4ester 17-11-2013 16:43 2256526

Ребята , не отображается прогресс бар , не пожете решить эту проблему - http://sendfile.su/897360 . Спасибо .

FX-DENIS 17-11-2013 22:44 2256781

Всё сам разобрался,просто надо было использовать новую ISSDOne 0.6b7 а у меня была ISDone0.4.2.5,хотя скачивал с офф сайта фриарк.У меня тока одна беда,кнопка отменить установку задрата в верхний правый угол,как ее спустить вниз?Посмотрите на скрин,на прошлой стр

Shkutu 18-11-2013 17:00 2257224

Johny777, спасиб, буду знать.
А вот такая проблемка. Есть код (дополняю деинсталлятор)
Код:

procedure UninstallCancelButtonOnClick(Sender: TObject);
begin
    UninstallProgressForm.CancelButton.ModalResult := mrAbort;
end;

procedure InitializeUninstallProgressForm();
begin
...
CancelButton.OnClick := @UninstallCancelButtonOnClick;
...
if ShowModal = mrAbort then Abort;
end;

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

habib2302 18-11-2013 21:34 2257422

помогите мне объеденить страницу select dir page с select program group page и сделать такое оформление под стандартное окно инсталлятора
выложил скрипт с таким же оформление если что
и как сделать чтобы список компонентов можно было скрыть и раскрыть

Nordek 18-11-2013 22:55 2257502

Цитата:

Цитата habib2302
объеденить страницу select dir page с select program group page »

Пример

Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
AllowNoIcons=true
DisableProgramGroupPage=true

[Icons]
Name: {group}\My Program; Filename: {app}

[Code]
procedure InitializeWizard();
begin
     
WizardForm.DiskSpaceLabel.Top := ScaleY(65);
      WizardForm.DirBrowseButton.Top := ScaleY(36);
      WizardForm.DirEdit.Top := ScaleY(37);
      WizardForm.NoIconsCheck.Parent := WizardForm.SelectDirPage;
      WizardForm.SelectDirLabel.Top := ScaleX(09)
      WizardForm.SelectDirBitmapImage.Top := ScaleY(0)
      WizardForm.SelectDirBrowseLabel.Visible := False
      WizardForm.SelectGroupBitmapImage.Top := ScaleY(95);
      WizardForm.SelectGroupBitmapImage.Parent := WizardForm.SelectDirPage;
      WizardForm.GroupBrowseButton.Parent := WizardForm.SelectDirPage;
      WizardForm.GroupBrowseButton.Top := ScaleY(133);
      WizardForm.GroupEdit.Parent := WizardForm.SelectDirPage;
      WizardForm.GroupEdit.Top := ScaleY(134);
      WizardForm.SelectStartMenuFolderBrowseLabel.Parent := WizardForm.SelectDirPage;
      WizardForm.SelectStartMenuFolderBrowseLabel.Top := ScaleY(170);
      WizardForm.SelectStartMenuFolderLabel.Parent := WizardForm.SelectDirPage;
      WizardForm.SelectStartMenuFolderLabel.Top := ScaleY(105);
end;



Цитата:

Цитата habib2302
как сделать чтобы список компонентов можно было скрыть и раскрыть »

Вариант 1

Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
ComponentsListTVStyle=true

[Components]
Name: a; Description: Компоненнт A; Flags: collapsed
Name: a/b; Description: Компоненнт AB

Вариант 2

Код:

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


[Components]
Name: a; Description: Компоненнт A; Flags: collapsed
Name: a/b; Description: Компоненнт AB

[Code]
procedure InitializeWizard();
begin
 
WizardForm.ComponentsList.TreeViewStyle := True;
end;


habib2302 18-11-2013 23:01 2257510

Nordek, первый способ почему то не работает

Nordek 18-11-2013 23:11 2257525

Цитата:

Цитата habib2302
первый способ почему то не работает »

Про компоненты? У меня всё работает.
В скрипт вставил? ComponentsListTVStyle=true добавить не забыл, Flags: collapsed учёл?

habib2302 19-11-2013 00:46 2257580

и как сделать чтобы компоненты были раскрыты

Nordek 19-11-2013 02:42 2257624

Цитата:

Цитата habib2302
и как сделать чтобы компоненты были раскрыты »

Убери Flags: collapsed.

Mat_y 19-11-2013 10:15 2257696

Вложений: 1
Nordek, читаю тему. Просто - спасибо.

Может подскажите мне тоже? Такая проблема...
-Использую модули ISDone и PrigressBar (Добавил в аттаче, хотя они стандартные).
-На странице самого процесса установки прогрессбар все время пустой и не заполняется, хотя установка идет нормально. Короче, не отображается прогресс установки.

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

Source: {mods}\*; DestDir: {app}\; Flags: ignoreversion recursesubdirs createallsubdirs
Как можно заставить работать прогрессбар? Могу даже от картинок отказаться (правда форма инсталлера у меня произвольная - с маской).

Mat_y 19-11-2013 13:05 2257768

И еще вопрос... как можно записать следующее...

Код:

begin
if выбран русский язык then begin
////
///
end else begin
///
///
end;
end;


nik1967 19-11-2013 14:11 2257798

Mat_y, посмотри здесь - лень переписывать.
По поводу прогресс бара - нужно смотреть весь скрипт, модулей не достаточно.

Mat_y 19-11-2013 14:20 2257800

Цитата:

По поводу прогресс бара - нужно смотреть весь скрипт, модулей не достаточно.
nik1967, могу я Вам сбросить?

Цитата:

Цитата nik1967
лень переписывать »

Спасибо... нашел, что хотел... сделаю, мне не лень.

Код:

var
  lang: String;

procedure CreateWizardImage;
begin
*******
*******
*******
  end;
  if lang='rus' then begin
  ***********
  end else begin
  ***********
  end;
  ***
end;
end;


Shkutu 19-11-2013 14:50 2257816

Всем доброго времени суток!
Кто-нибудь знает, можно ли на странице выборка компонентов убрать выводимый "space requied". ShowComponentSizes=no отключает вывод только для самих компонентов, но не общий

Цитата:

Цитата Mat_y
И еще вопрос... как можно записать следующее... »

Вот так например:
Код:

if ActiveLanguage = 'russian' then
  ...
 else ...


Mat_y 19-11-2013 15:35 2257833

Цитата:

Цитата Shkutu
Вот так например: »

Так даже лучше!

nik1967 19-11-2013 15:46 2257839

Shkutu,
Код:

WizardForm.ComponentsDiskSpaceLabel.Hide;
Mat_y, кидай, только когда посмотрю - не знаю, дела...
читать дальше »
Код:

function MbOrTb(Float: Extended): String;
begin
  if Float < 1024 then Result:= NumToStr(Float)+ExpandConstant('{cm:Mb}') else
    if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+ExpandConstant('{cm:Gb}') else
      Result:= NumToStr(Float/(1024*1024))+ExpandConstant('{cm:Tb}');
end;


Mat_y 19-11-2013 15:51 2257840

Цитата:

Цитата nik1967
Mat_y, кидай, только когда посмотрю - не знаю, дела... »

Хорошо, заранее спасибо... сейчас пришлю.
А с этим место я справился так:
читать дальше »
Код:

function MbOrTb(Float: Extended): String;
begin
  if Float < 1024 then Result:= NumToStr(Float)+' '+CustomMessage(lang+'Mb') else
    if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' '+CustomMessage(lang+'Gb') else
      Result:= NumToStr(Float/(1024*1024))+' '+CustomMessage(lang+'Tb');
end;


Shkutu 19-11-2013 15:55 2257845

nik1967, спасибо!

nik1967 19-11-2013 16:05 2257851

Shkutu, и может кому нибудь ещё. Если установлена расширенная версия от Res Tools, то при запуске Compil32Ex.exe появляется чудесная возможность посмотреть нужные параметры на вкладке "Редактор форм"("WizardForm Designer"), или на других вкладках :).

Mat_y 19-11-2013 17:26 2257917

Господа!
А нет ли возможности отображать и устанавливать разные компоненты в списке в зависимости от выбранного языка? Т.е. если язык русский, то и компоненты не только по-русски написаны, но и их английские аналоги даже не отображаются для выбора. А если английский язык, то русские компоненты не отображаются.

Shkutu 19-11-2013 18:04 2257951

Mat_y, есть
Код:

[Components]
Name: "component1"; Description: "component 1"; Types: full; Languages: russian

это если компонент для конкретного языка.
А если надо название компонента для конкретного языка (компонент один и тот же), то можно просто пользоваться секцией CustomMessages:
Код:

[Components]
Name: "component1"; Description: "{cm: comp}"; Types: full

[CustomMessages]
english.comp = Component 1
russian.comp = Компонент 1


Dinvin4ester 19-11-2013 19:48 2258012

Цитата:

Ребята , не отображается прогресс бар , не пожете решить эту проблему - http://sendfile.su/897360 . Спасибо .
А мне не поможете ?

Johny777 20-11-2013 07:22 2258290

Shkutu,
Цитата:

Цитата Shkutu
А вот такая проблемка. Есть код (дополняю деинсталлятор) ... Но Abort почему-то срабатывает, только если на кнопку "отмена" нажать дважды. Подскажите, плиз, можно ли с этим что-то сделать? »

я по твоему запросу игрался с кодом. всегда вылетает исключение. К слову, вовсе необязательно присваивать UninstallProgressForm.CancelButton.ModalResult := mrAbort; при нажатии. Это можно сделать и до показывания окна в модальном режиме, например так:
читать дальше »
Код:

procedure InitializeUninstallProgressForm();
begin
...
UninstallProgressForm.CancelButton.ModalResult := mrAbort;
...
if ShowModal = mrAbort then Abort;
end;


могу посоветивать одно (считаю это действительно самым простым): вызывать своё окно вместо стандартного
вот пример. В нём возможно много для тебя ненужного кода, но думаю смысл понятен http://forum.oszone.net/post-1939326-305.html

вот упрощённая версия:
читать дальше »
Код:

function CreateUninstallForm: Integer;
var
   
UninstallForm: TSetupForm;
    UninstallButton, ExitButton: TButton;
begin
   
UninstallForm := CreateCustomForm;
    with UninstallForm do
    begin
       
BorderStyle := bsSingle;
        BorderIcons := [biSystemMenu,biMinimize];
        Position := poScreenCenter;
        Caption := 'Uninstall';
        ClientWidth := ScaleX(634);
        ClientHeight := ScaleY(586);

        //uninstall button
       
UninstallButton := TButton.Create(nil);
        with UninstallButton do
        begin
           
Parent := UninstallForm;
            SetBounds(ScaleX(500), ScaleY(527), ScaleX(69), ScaleY(23));
            Cursor := crHand;
            Caption := SetupMessage(msgButtonYes);
            ModalResult := mrOk;
        end;

        //exit button
       
ExitButton := TButton.Create(nil);
        with ExitButton do
        begin
           
Parent := UninstallForm;
            SetBounds(UninstallButton.Left - UninstallButton.Width - ScaleX(16), UninstallButton.Top, UninstallButton.Width, UninstallButton.Height);
            Caption := SetupMessage(msgButtonNo);
            Cursor := crHand;
            ModalResult := mrCancel;
        end;

        Result := ShowModal;

        Free;
    end;
end;

function Unstall(): Boolean;
begin
   
Result := False;

//    if  условия выполнены, то возвращаем True, что ведёт к полному удалению
//    ...
//    then Result := True;
end;

function InitializeUninstall(): Boolean;
var
   
ResultCode: Integer;
begin
   
Result := False;

    if not UninstallSilent then
    begin
       
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
        Exit;
    end;

    if CreateUninstallForm = mrOk then Result := Unstall();
end;


Mat_y 20-11-2013 09:04 2258307

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

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

function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';
//////////////////////////////////////////////
  RedesignWizardForm;
MyTask:=TCheckBox.Create(WizardForm);
with MyTask do
begin
Parent:=WizardForm.SelectDirPage;
Caption:='Создать резервную копию';
Left:=ScaleX(0);
Top:=ScaleY(180);
Width:=ScaleX(400);
Height:=ScaleY(15);
TabOrder:=0;
Checked:=False;
//////////////////////////////////////////////
 
 if MyTask.Checked then begin
MyFiles:=['*']; // указать файлы или маски нужные для бакупа через запятую. при указании маски '*' бакупятся все файлы с вложенными папками
MyDir:=ExpandConstant('{app}'+'\FolderName\'); //папка откуда бакупить
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;



Его задача переместить все файлы и папки из одной папки №1 в папку №2.
Так вот если папка №2 уже существует и в ней есть файлы или даже пустые папки, то часть файлов он просто не перемещает, другие файлы перемещает частично... при этом никакой зависимости от присутствующих в папке №1 файлов нет.
Код брал из справки... можно ли его как-то усовершенствовать в этом вопросе? Можно ли не перемещать, а копировать файлы?

Shkutu 20-11-2013 13:16 2258435

Johny777, спасибо, буду пробовать.
Кстати, исключение при Abort - это если из среды запускать. Если .ехе сам по себе - то вырубается молча вроде бы, без всяких эксепшнов.
Mat_y, чтобы не перемещать, а копировать, можно использовать CopyFile
Код:

function CopyFile(const srcFile, destFile: PChar, FailIfExists: boolean): Integer; external 'CopyFileA@kernel32.dll stdcall';
Цитата:

Цитата Mat_y
часть файлов он просто не перемещает »

А совпадающих имен точно нет?

El Sanchez 20-11-2013 19:06 2258654

Цитата:

Цитата Mat_y
Его задача переместить все файлы и папки из одной папки №1 в папку №2 »

Mat_y, пробуйте.
читать дальше »

Код:

#define A = (Defined UNICODE) ? "W" : "A"
const
   
FO_MOVE = $1;
    FO_COPY = $2;
    FOF_SILENT = $0004;
    FOF_NOCONFIRMATION = $0010;
    FOF_NOCONFIRMMKDIR = $0200;
    FOF_NOERRORUI = $0400;

type
   
SHFILEOPSTRUCT = record
       
hwnd: HWND;
        wFunc: UINT;
        pFrom: String;
        pTo: String;
        fFlags: Longint;
        fAnyOperationsAborted: BOOL;
        hNameMappings: Longint;
        lpszProgressTitle: String;
    end;
   
function SHFileOperation(var lpFileOp: SHFILEOPSTRUCT): Integer; external 'SHFileOperation{#A}@shell32.dll stdcall';

/////////////////////////////////////////////////////////////////////
function xcopy(const pFrom, pTo: String; const wFunc: UINT): Integer;
var
   
shfos: SHFILEOPSTRUCT;
begin
   
shfos.wFunc := wFunc;
    shfos.pFrom := Format('%s'#0, [pFrom]);
    shfos.pTo := Format('%s'#0, [pTo]);
    shfos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI;
    Result := SHFileOperation(shfos);
end;

/////////////////////////////
procedure InitializeWizard();
begin
   
xcopy('C:\test', 'D:\backup', FO_MOVE);
end;


Mat_y 20-11-2013 20:25 2258727

Цитата:

Цитата Shkutu
А совпадающих имен точно нет? »

Есть... но он не только их не перемещает. Попадет на совпадение папки или файла и понеслась... можно как-то его заставить заменять одинаковые файлы.

Johny777 21-11-2013 07:24 2258981

Mat_y, вот накатал копирование файлов из папки куда-нибудь, возможностью перезаписи/пропуска и перемещения файлов в одной функции с опциональным отображением прогресса:
читать дальше »
Код:

/////////////////////////////////  File Mask Works ////////////////////////
const
   
ALL_FILES = '*';
    BACKSLASH = '\';
type
   
_FILE_MASK = record
       
Parts: array of String;
        PartsCount: Integer;
    end;

    _FILES_MASKS_SHOBLA = record
       
Masks: array of _FILE_MASK;
        MasksCount: Integer;
    end;
procedure Inc(var Int: Integer);
begin
   
Int := Int + 1;
end;
procedure Dec(var Int: Integer);
begin
   
Int := Int - 1;
end;
procedure IncEx(var Int: Extended; const Value: Extended);
begin
   
Int := Int + Value;
end;
procedure DecEx(var Int: Extended; const Value: Extended);
begin
   
Int := Int - Value;
end;
procedure AddFragmentToFileMask(const Fragment: String; var f: _FILE_MASK);
begin
   
Inc(f.PartsCount);
    SetArrayLength(f.Parts, f.PartsCount);
    f.Parts[f.PartsCount-1] := Fragment;
    //MsgBox(IntToStr(f.PartsCount-1) + #13#10 + Fragment, mbError, MB_OK); //  debug
end;
procedure SplitFileMask(const FileMask: String; out f: _FILE_MASK);
var
   
i, Len: Integer;
    Fragment: String;
begin
   
Len := Length(FileMask);   
    Fragment := '';
    for i := 1 to Len do
    begin
        if
FileMask[i] = '*' then
        begin
            if
Fragment <> '' then
            begin
               
AddFragmentToFileMask(Fragment, f);
                Fragment := '';
            end;
            Continue;
        end;
        Fragment := Fragment + FileMask[i];
    end;
    if Fragment <> '' then AddFragmentToFileMask(Fragment, f);
end;
procedure SplitFilesMasks(const FilesMasks: array of String; var f: _FILES_MASKS_SHOBLA);
var
   
i, Len: Integer;
begin
   
Len := GetArrayLength(FilesMasks);
    for i := 0 to Len-1 do
    begin
       
Inc(f.MasksCount);
        SetArrayLength(f.Masks, f.MasksCount);
        SplitFileMask(FilesMasks[i], f.Masks[f.MasksCount-1]);
    end;
end;
function ThatFile(const uFileName: String; const f: _FILES_MASKS_SHOBLA): Boolean;
var
   
a, i: Integer;
begin
    for
a := 0 to f.MasksCount-1 do
    begin
     
Result := True;
      for i := 0 to f.Masks[a].PartsCount-1 do
         
Result := Result and ( Pos(f.Masks[a].Parts[i], uFileName) <> 0 );
      if Result then Break;
    end;
end;
function AllFiles(const Masks: array of String): Boolean;
var
   
Len: Integer;
begin
   
Len := GetArrayLength(Masks);
    case Len of
       
0: Result := True;
        1: Result := Masks[0] = ALL_FILES;
    else
       
Result := False;
    end;
end;
///////////////////////////////////////

//procedure Debug();
//var
//    z: Byte;
//    f: _FILES_MASKS_SHOBLA;
//begin
//    SplitFilesMasks(['*Soft*.exe', '*Soft*a*.exe', 'Valve*.*', '*.e*', '*.exe'], f);
//    if not ThatFile('hl2.avi', f) then MsgBox('no', mbInformation, MB_OK);
//    if ThatFile('hl2.exe', f) then MsgBox('yes', mbInformation, MB_OK);
//end;

////////////////////////////////////////////////////////////////////////////////////////////
 
const
   
COLLECTING_INFO = 0;
    IN_PROGRESS = 1;
    FINISHED = -1;
   
    UNDEF_INT = -1;

    COPY_BLOCK_SIZE = 65536;
   
type
   
_FILE_INFO = record
       
FilePath: String;
        Size: Extended;
    end;
   
    _FILE_CALLBACK =
    function
   
(
        const Msg: Integer; //сообщение статуса копирования
       
const srcFilePath: String; //путь к текущему исходному файлу
       
const dstFilePath: String; //путь к файлу назначения
       
const FileBytes: Extended; //размер текущего файла в байтах
       
const FileBytesCopied: Extended; //сколько байт текущего файла скопировано
       
const OverallBytes: Extended; //размер всех файлов в байтах
       
const OverallBytesCopied: Extended //сколько байт всех файлов скопировано
   
): Boolean; //чтоб отменить копирование нужно вернуть False
   
function QuadPart(const HighPart: Longint; const LowPart: DWORD): Extended;
begin
   
Result := HighPart * $80000000{2^32} + LowPart;
end;
procedure AddFileInfo
(
    const uFileInfo: TFindRec;
    const uFilePath: String;
    var Files: array of _FILE_INFO;
    var FilesCount: Integer
);
begin
   
Inc(FilesCount);
    SetArrayLength(Files, FilesCount);
    Files[FilesCount-1].FilePath := uFilePath + uFileInfo.Name;
    Files[FilesCount-1].Size := QuadPart(uFileInfo.SizeHigh, uFileInfo.SizeLow);
end;
procedure FindFiles
(
    const srcFolder: String;
    const f: _FILES_MASKS_SHOBLA;
    const FindAll: Boolean;
    var Files: array of _FILE_INFO;
    var FilesCount: Integer;
    var Canceled: Boolean;
    const CallBack: _FILE_CALLBACK
);
var
   
FileInfo: TFindRec;
begin
    if
FindFirst(srcFolder + '*', FileInfo) then
    try
        repeat
            if
Canceled then Break;
       
            if (FileInfo.Name <> '.') and (FileInfo.Name <> '..') then
            begin
                if
FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                begin

                    if
FindAll then
                     
AddFileInfo(
                          FileInfo,
                          srcFolder,
                          Files,
                          FilesCount
                      )
                    else if ThatFile(FileInfo.Name, f) then
                     
AddFileInfo(
                          FileInfo,
                          srcFolder,
                          Files,
                          FilesCount
                      );
                     
                    if CallBack <> nil then
                      if not
CallBack
                      (
                          COLLECTING_INFO,
                          Files[FilesCount-1].FilePath,
                          '',
                          Files[FilesCount-1].Size,
                          UNDEF_INT,
                          UNDEF_INT,
                          UNDEF_INT
                      ) then
                      begin
                         
Canceled := True;
                          Break;
                      end;

                end else if FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
                 
FindFiles(
                      srcFolder + FileInfo.Name + BACKSLASH,
                      f,
                      FindAll,
                      Files,
                      FilesCount,
                      Canceled,
                      CallBack
                  );
            end;
        until not FindNext(FileInfo);

    finally
       
FindClose(FileInfo);
    end;
end;
function CountFilesSize(const Files: array of _FILE_INFO; const FilesCount: Integer): Extended;
var
   
i: Integer;
begin
   
Result := 0;
    for i := 0 to FilesCount-1 do IncEx(Result, Files[i].Size);
end;
function GetNewFilePath(
    const srcFolder: String;
    const dstFolder: String;
    const srcFilePath: String
): String// returns dstFilePath
var
   
BuffFilePath: String;
begin
   
BuffFilePath := srcFilePath;
    StringChange(BuffFilePath, srcFolder, '');
    Result := dstFolder + BuffFilePath;
    //MsgBox( 'srcFolder: '  + srcFolder    + #13#10 +
    //        'dstFolder: '  + dstFolder    + #13#10 +
    //        'srcFilePath: ' + srcFilePath  + #13#10 +
    //        'dstFilePath: ' + Result,
    //mbInformation, MB_OK); // debug
end;
function CopyFiles(
    const srcFolder: String; //путь, откуда копировать
   
const dstFolder: String; //путь, куда откуда копировать
   
const Masks: array of String; //массив масок файла, например: ['*Soft*.exe', '*Soft*a*.exe', 'Valve*.*', '*.e*', '*.exe']
   
const Overwrite: Boolean; //перезапись существующих файлов
   
const Move: Boolean; //активировать перемещение (после успешного копирования исходный файл будет удалён, включая папку, где он лежал, если она пустая)
   
const CallBack: _FILE_CALLBACK //указатель на функцию обратного вызова _FILE_CALLBACK или nil
): Boolean;
var
   
Files: array of _FILE_INFO;
    f: _FILES_MASKS_SHOBLA;
    FilesCount: Integer;
    CopyAll: Boolean;
   
    Canceled: Boolean;

    OverallBytes, OverallBytesCopied: Extended;

    srcFileStream, dstFileStream: TFileStream;
    dstFilePath, srcFilePath: String;
    i, CopyBytes, BytesLeft: Integer;
   
    CurrentFileDir: String;
begin
   
Result := False;
   
    if not DirExists(srcFolder) then Exit;
   
    Canceled := False;
   
    if CallBack <> nil then
      if not
CallBack(COLLECTING_INFO, '', '', UNDEF_INT, UNDEF_INT, UNDEF_INT, UNDEF_INT) then Exit;

    CopyAll := AllFiles(Masks);
    if not CopyAll then SplitFilesMasks(Masks, f);

    FilesCount := 0;
    FindFiles
    (
        AddBackslash(RemoveBackslash(srcFolder)),
        f,
        CopyAll,
        Files,
        FilesCount,
        Canceled,
        CallBack
    );
    if (FilesCount = 0) or Canceled then Exit;
   
    OverallBytes := CountFilesSize(Files, FilesCount);
    OverallBytesCopied := 0;
   
    for i := 0 to FilesCount-1 do
    begin
        if
Canceled then Break;
       
        srcFilePath := Files[i].FilePath;
        dstFilePath := GetNewFilePath(srcFolder, AddBackslash(RemoveBackslash(dstFolder)), srcFilePath);

        if not Overwrite then if FileExists(dstFilePath) then Continue;
       
        ForceDirectories(ExtractFilePath(dstFilePath));

        srcFileStream := TFileStream.Create(srcFilePath, fmOpenRead);
        dstFileStream := TFileStream.Create(dstFilePath, fmCreate);
       
        BytesLeft := srcFileStream.Size - srcFileStream.Position;
        CopyBytes := COPY_BLOCK_SIZE;
        try
            while
BytesLeft > 0 do
            begin
                if
BytesLeft < COPY_BLOCK_SIZE then CopyBytes := BytesLeft;
               
                dstFileStream.CopyFrom(srcFileStream, CopyBytes);
               
                BytesLeft := srcFileStream.Size-srcFileStream.Position;

                IncEx(OverallBytesCopied, CopyBytes);
                if CallBack <> nil then
                  if not
CallBack
                  (
                      IN_PROGRESS,
                      srcFilePath,
                      dstFilePath,
                      Files[i].Size,
                      Files[i].Size - BytesLeft,
                      OverallBytes,
                      OverallBytesCopied
                  ) then
                  begin
                     
Canceled := True;
                      Break;
                  end;
            end;
        finally
           
srcFileStream.Free;
            dstFileStream.Free;
            if Canceled then
             
DeleteFile(dstFilePath);

            if Move then
            begin
               
DeleteFile(srcFilePath);
                CurrentFileDir := ExtractFilePath(srcFilePath);
                if CurrentFileDir <> srcFolder then
                 
RemoveDir(CurrentFileDir); // removes dir if it us empty
           
end;
        end;
    end;

    Result := not Canceled;
end;

////////////////////////////////////////////  demo //////////////////////////////////////////////////////////////////
var
   
MainCopyPrgBar,FileCopyPrgBar: TNewProgressBar;
   
    function ____________________
    (
        const Msg: Integer;
        const srcFilePath: String;
        const dstFilePath: String;
        const FileBytes: Extended;
        const FileBytesCopied: Extended;
        const OverallBytes: Extended;
        const OverallBytesCopied: Extended
    ): Boolean;
    begin
        case
Msg of
           
COLLECTING_INFO: WizardForm.Caption := srcFilePath;
            IN_PROGRESS:
            begin
               
WizardForm.Caption := FloatToStr(FileBytes) + #32#32 + FloatToStr(FileBytesCopied);

                FileCopyPrgBar.Position := Round( (100*FileBytesCopied) / FileBytes );
                MainCopyPrgBar.Position := Round( (100*OverallBytesCopied) / OverallBytes );
            end;
            FINISHED: MsgBox('Finish! :)', mbInformation, MB_OK);
        end;
       
        Application.ProcessMessages;
       
        Result := not Application.Terminated;
    end;
   

   

procedure ButtonClick(Sender: TObject);
begin
   
CopyFiles('C:\Program Files (x86)\Source Engine 15\common\half-life 2\', 'C:\test',[], True, False, @____________________);
end;

procedure InitializeWizard();
begin
   
WizardForm.OuterNotebook.Hide;
    WizardForm.Canvas.Brush.Style := bsClear;
    MainCopyPrgBar := TNewProgressBar.Create(nil);
    with MainCopyPrgBar do
    begin
       
Parent:= WizardForm;
        SetBounds(ScaleX(5), ScaleY(5), WizardForm.ClientWidth-10, ScaleY(20));
    end;
    FileCopyPrgBar := TNewProgressBar.Create(nil);
    with FileCopyPrgBar do
    begin
       
Parent:= WizardForm;
        SetBounds(ScaleX(5), ScaleY(30), WizardForm.ClientWidth-10, ScaleY(20));
    end;

    with TButton.Create(WizardForm) do
    begin
       
Parent:= WizardForm;
        Left := ScaleX(0);
        Top := ScaleY(200);
        Width := ScaleY(150);
        Caption:='Copy';
        OnClick:=@ButtonClick;
    end;
end;


справка по заголовкам:
Код:

function CopyFiles(
    const srcFolder: String; //путь, откуда копировать
   
const dstFolder: String; //путь, куда откуда копировать
   
const Masks: array of String; //массив масок файла, например: ['*Soft*.exe', '*Soft*a*.exe', 'Valve*.*', '*.e*', '*.exe']
   
const Overwrite: Boolean; //перезапись существующих файлов
   
const Move: Boolean; //активировать перемещение (после успешного копирования исходный файл будет удалён, включая папку, где он лежал, если она пустая)
   
const CallBack: _FILE_CALLBACK //указатель на функцию обратного вызова _FILE_CALLBACK или nil
): Boolean;


type
   
_FILE_CALLBACK =
    function
   
(
        const Msg: Integer; //сообщение статуса копирования
       
const srcFilePath: String; //путь к текущему исходному файлу
       
const dstFilePath: String; //путь к файлу назначения
       
const FileBytes: Extended; //размер текущего файла в байтах
       
const FileBytesCopied: Extended; //сколько байт текущего файла скопировано
       
const OverallBytes: Extended; //размер всех файлов в байтах
       
const OverallBytesCopied: Extended //сколько байт всех файлов скопировано
   
): Boolean; //чтоб отменить копирование нужно вернуть False

El Sanchez, кажись ему надо по маске копировать (судя по коду) ;)

Nordek 21-11-2013 09:33 2259026

Mat_y, Пример переноса на новую форму (пригодится):
читать дальше »
Код:

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


[Code]
var
 
ISCustomPage1: TWizardPage;


/////////////////////////////////  File Mask Works ////////////////////////
const
   
ALL_FILES = '*';
    BACKSLASH = '\';
type
   
_FILE_MASK = record
       
Parts: array of String;
        PartsCount: Integer;
    end;

    _FILES_MASKS_SHOBLA = record
       
Masks: array of _FILE_MASK;
        MasksCount: Integer;
    end;
procedure Inc(var Int: Integer);
begin
   
Int := Int + 1;
end;
procedure Dec(var Int: Integer);
begin
   
Int := Int - 1;
end;
procedure IncEx(var Int: Extended; const Value: Extended);
begin
   
Int := Int + Value;
end;
procedure DecEx(var Int: Extended; const Value: Extended);
begin
   
Int := Int - Value;
end;
procedure AddFragmentToFileMask(const Fragment: String; var f: _FILE_MASK);
begin
   
Inc(f.PartsCount);
    SetArrayLength(f.Parts, f.PartsCount);
    f.Parts[f.PartsCount-1] := Fragment;
    //MsgBox(IntToStr(f.PartsCount-1) + #13#10 + Fragment, mbError, MB_OK); //  debug
end;
procedure SplitFileMask(const FileMask: String; out f: _FILE_MASK);
var
   
i, Len: Integer;
    Fragment: String;
begin
   
Len := Length(FileMask);
    Fragment := '';
    for i := 1 to Len do
    begin
        if
FileMask[i] = '*' then
        begin
            if
Fragment <> '' then
            begin
               
AddFragmentToFileMask(Fragment, f);
                Fragment := '';
            end;
            Continue;
        end;
        Fragment := Fragment + FileMask[i];
    end;
    if Fragment <> '' then AddFragmentToFileMask(Fragment, f);
end;
procedure SplitFilesMasks(const FilesMasks: array of String; var f: _FILES_MASKS_SHOBLA);
var
   
i, Len: Integer;
begin
   
Len := GetArrayLength(FilesMasks);
    for i := 0 to Len-1 do
    begin
       
Inc(f.MasksCount);
        SetArrayLength(f.Masks, f.MasksCount);
        SplitFileMask(FilesMasks[i], f.Masks[f.MasksCount-1]);
    end;
end;
function ThatFile(const uFileName: String; const f: _FILES_MASKS_SHOBLA): Boolean;
var
   
a, i: Integer;
begin
    for
a := 0 to f.MasksCount-1 do
    begin
     
Result := True;
      for i := 0 to f.Masks[a].PartsCount-1 do
         
Result := Result and ( Pos(f.Masks[a].Parts[i], uFileName) <> 0 );
      if Result then Break;
    end;
end;
function AllFiles(const Masks: array of String): Boolean;
var
   
Len: Integer;
begin
   
Len := GetArrayLength(Masks);
    case Len of
       
0: Result := True;
        1: Result := Masks[0] = ALL_FILES;
    else
       
Result := False;
    end;
end;
///////////////////////////////////////

//procedure Debug();
//var
//    z: Byte;
//    f: _FILES_MASKS_SHOBLA;
//begin
//    SplitFilesMasks(['*Soft*.exe', '*Soft*a*.exe', 'Valve*.*', '*.e*', '*.exe'], f);
//    if not ThatFile('hl2.avi', f) then MsgBox('no', mbInformation, MB_OK);
//    if ThatFile('hl2.exe', f) then MsgBox('yes', mbInformation, MB_OK);
//end;

////////////////////////////////////////////////////////////////////////////////////////////
 
const
   
COLLECTING_INFO = 0;
    IN_PROGRESS = 1;
    FINISHED = -1;

    UNDEF_INT = -1;

    COPY_BLOCK_SIZE = 65536;

type
   
_FILE_INFO = record
       
FilePath: String;
        Size: Extended;
    end;

    _FILE_CALLBACK =
    function
   
(
        const Msg: Integer; //сообщение статуса копирования
       
const srcFilePath: String; //путь к текущему исходному файлу
       
const dstFilePath: String; //путь к файлу назначения
       
const FileBytes: Extended; //размер текущего файла в байтах
       
const FileBytesCopied: Extended; //сколько байт текущего файла скопировано
       
const OverallBytes: Extended; //размер всех файлов в байтах
       
const OverallBytesCopied: Extended //сколько байт всех файлов скопировано
   
): Boolean; //чтоб отменить копирование нужно вернуть False

function QuadPart(const HighPart: Longint; const LowPart: DWORD): Extended;
begin
   
Result := HighPart * $80000000{2^32} + LowPart;
end;
procedure AddFileInfo
(
    const uFileInfo: TFindRec;
    const uFilePath: String;
    var Files: array of _FILE_INFO;
    var FilesCount: Integer
);
begin
   
Inc(FilesCount);
    SetArrayLength(Files, FilesCount);
    Files[FilesCount-1].FilePath := uFilePath + uFileInfo.Name;
    Files[FilesCount-1].Size := QuadPart(uFileInfo.SizeHigh, uFileInfo.SizeLow);
end;
procedure FindFiles
(
    const srcFolder: String;
    const f: _FILES_MASKS_SHOBLA;
    const FindAll: Boolean;
    var Files: array of _FILE_INFO;
    var FilesCount: Integer;
    var Canceled: Boolean;
    const CallBack: _FILE_CALLBACK
);
var
   
FileInfo: TFindRec;
begin
    if
FindFirst(srcFolder + '*', FileInfo) then
    try
        repeat
            if
Canceled then Break;

            if (FileInfo.Name <> '.') and (FileInfo.Name <> '..') then
            begin
                if
FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                begin

                    if
FindAll then
                     
AddFileInfo(
                          FileInfo,
                          srcFolder,
                          Files,
                          FilesCount
                      )
                    else if ThatFile(FileInfo.Name, f) then
                     
AddFileInfo(
                          FileInfo,
                          srcFolder,
                          Files,
                          FilesCount
                      );

                    if CallBack <> nil then
                      if not
CallBack
                      (
                          COLLECTING_INFO,
                          Files[FilesCount-1].FilePath,
                          '',
                          Files[FilesCount-1].Size,
                          UNDEF_INT,
                          UNDEF_INT,
                          UNDEF_INT
                      ) then
                      begin
                         
Canceled := True;
                          Break;
                      end;

                end else if FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
                 
FindFiles(
                      srcFolder + FileInfo.Name + BACKSLASH,
                      f,
                      FindAll,
                      Files,
                      FilesCount,
                      Canceled,
                      CallBack
                  );
            end;
        until not FindNext(FileInfo);

    finally
       
FindClose(FileInfo);
    end;
end;
function CountFilesSize(const Files: array of _FILE_INFO; const FilesCount: Integer): Extended;
var
   
i: Integer;
begin
   
Result := 0;
    for i := 0 to FilesCount-1 do IncEx(Result, Files[i].Size);
end;
function GetNewFilePath(
    const srcFolder: String;
    const dstFolder: String;
    const srcFilePath: String
): String// returns dstFilePath
var
   
BuffFilePath: String;
begin
   
BuffFilePath := srcFilePath;
    StringChange(BuffFilePath, srcFolder, '');
    Result := dstFolder + BuffFilePath;
    //MsgBox( 'srcFolder: '  + srcFolder    + #13#10 +
    //        'dstFolder: '  + dstFolder    + #13#10 +
    //        'srcFilePath: ' + srcFilePath  + #13#10 +
    //        'dstFilePath: ' + Result,
    //mbInformation, MB_OK); // debug
end;
function CopyFiles(
    const srcFolder: String; //путь, откуда копировать
   
const dstFolder: String; //путь, куда откуда копировать
   
const Masks: array of String; //массив масок файла, например: ['*Soft*.exe', '*Soft*a*.exe', 'Valve*.*', '*.e*', '*.exe']
   
const Overwrite: Boolean; //перезапись существующих файлов
   
const Move: Boolean; //активировать перемещение (после успешного копирования исходный файл будет удалён, включая папку, где он лежал, если она пустая)
   
const CallBack: _FILE_CALLBACK //указатель на функцию обратного вызова _FILE_CALLBACK или nil
): Boolean;
var
   
Files: array of _FILE_INFO;
    f: _FILES_MASKS_SHOBLA;
    FilesCount: Integer;
    CopyAll: Boolean;

    Canceled: Boolean;

    OverallBytes, OverallBytesCopied: Extended;

    srcFileStream, dstFileStream: TFileStream;
    dstFilePath, srcFilePath: String;
    i, CopyBytes, BytesLeft: Integer;

    CurrentFileDir: String;
begin
   
Result := False;

    if not DirExists(srcFolder) then Exit;

    Canceled := False;

    if CallBack <> nil then
      if not
CallBack(COLLECTING_INFO, '', '', UNDEF_INT, UNDEF_INT, UNDEF_INT, UNDEF_INT) then Exit;

    CopyAll := AllFiles(Masks);
    if not CopyAll then SplitFilesMasks(Masks, f);

    FilesCount := 0;
    FindFiles
    (
        AddBackslash(RemoveBackslash(srcFolder)),
        f,
        CopyAll,
        Files,
        FilesCount,
        Canceled,
        CallBack
    );
    if (FilesCount = 0) or Canceled then Exit;

    OverallBytes := CountFilesSize(Files, FilesCount);
    OverallBytesCopied := 0;

    for i := 0 to FilesCount-1 do
    begin
        if
Canceled then Break;

        srcFilePath := Files[i].FilePath;
        dstFilePath := GetNewFilePath(srcFolder, AddBackslash(RemoveBackslash(dstFolder)), srcFilePath);

        if not Overwrite then if FileExists(dstFilePath) then Continue;

        ForceDirectories(ExtractFilePath(dstFilePath));

        srcFileStream := TFileStream.Create(srcFilePath, fmOpenRead);
        dstFileStream := TFileStream.Create(dstFilePath, fmCreate);

        BytesLeft := srcFileStream.Size - srcFileStream.Position;
        CopyBytes := COPY_BLOCK_SIZE;
        try
            while
BytesLeft > 0 do
            begin
                if
BytesLeft < COPY_BLOCK_SIZE then CopyBytes := BytesLeft;

                dstFileStream.CopyFrom(srcFileStream, CopyBytes);

                BytesLeft := srcFileStream.Size-srcFileStream.Position;

                IncEx(OverallBytesCopied, CopyBytes);
                if CallBack <> nil then
                  if not
CallBack
                  (
                      IN_PROGRESS,
                      srcFilePath,
                      dstFilePath,
                      Files[i].Size,
                      Files[i].Size - BytesLeft,
                      OverallBytes,
                      OverallBytesCopied
                  ) then
                  begin
                     
Canceled := True;
                      Break;
                  end;
            end;
        finally
           
srcFileStream.Free;
            dstFileStream.Free;
            if Canceled then
             
DeleteFile(dstFilePath);

            if Move then
            begin
               
DeleteFile(srcFilePath);
                CurrentFileDir := ExtractFilePath(srcFilePath);
                if CurrentFileDir <> srcFolder then
                 
RemoveDir(CurrentFileDir); // removes dir if it us empty
           
end;
        end;
    end;

    Result := not Canceled;
end;

////////////////////////////////////////////  demo //////////////////////////////////////////////////////////////////
var
   
MainCopyPrgBar,FileCopyPrgBar: TNewProgressBar;

    function ____________________
    (
        const Msg: Integer;
        const srcFilePath: String;
        const dstFilePath: String;
        const FileBytes: Extended;
        const FileBytesCopied: Extended;
        const OverallBytes: Extended;
        const OverallBytesCopied: Extended
    ): Boolean;
    begin
        case
Msg of
           
COLLECTING_INFO: WizardForm.Caption := srcFilePath;
            IN_PROGRESS:
            begin
               
WizardForm.Caption := FloatToStr(FileBytes) + #32#32 + FloatToStr(FileBytesCopied);

                FileCopyPrgBar.Position := Round( (100*FileBytesCopied) / FileBytes );
                MainCopyPrgBar.Position := Round( (100*OverallBytesCopied) / OverallBytes );
            end;
            FINISHED: MsgBox('Finish! :)', mbInformation, MB_OK);
        end;

        Application.ProcessMessages;

        Result := not Application.Terminated;
    end;




procedure ButtonClick(Sender: TObject);
begin
   
CopyFiles('C:\Program Files (x86)\Source Engine 15\common\half-life 2\', 'C:\test',[], True, False, @____________________);
end;

procedure InitializeWizard();
begin

 
ISCustomPage1 := CreateCustomPage(wpInfoBefore, 'Копирование', 'Будем копировать?');

//    WizardForm.OuterNotebook.Hide;
   
WizardForm.Canvas.Brush.Style := bsClear;
    MainCopyPrgBar := TNewProgressBar.Create(nil);
    with MainCopyPrgBar do
    begin
       
Parent := ISCustomPage1.Surface;
        SetBounds(ScaleX(5), ScaleY(5), WizardForm.ClientWidth-85, ScaleY(20));
    end;
    FileCopyPrgBar := TNewProgressBar.Create(nil);
    with FileCopyPrgBar do
    begin
       
Parent := ISCustomPage1.Surface;
        SetBounds(ScaleX(5), ScaleY(30), WizardForm.ClientWidth-85, ScaleY(20));
    end;

    with TButton.Create(WizardForm) do
    begin
       
Parent := ISCustomPage1.Surface;
        Left := ScaleX(5);
        Top := ScaleY(200);
        Width := ScaleY(150);
        Caption:='Copy';
        OnClick:=@ButtonClick;
    end;
end;


Shkutu 21-11-2013 13:12 2259156

Цитата:

Цитата Mat_y
заменять одинаковые файлы »

Используя MoveFile(const srcFile, destFile: PChar): Integer - нет. Эта функция, если destFile файл существует, работать не будет. Из вариантов - копирование вместо перемещения
Код:

function CopyFile(const srcFile, destFile: PansiChar, FailIfExists: boolean): Integer;
 external 'CopyFileA@kernel32.dll stdcall'; //если FailIfExists=false, то файл перезапишется

.
Или перемещение вот-так
Код:

function MoveFileEx(const srcFile, destFile: PansiChar, dwFlags: DWORD): Integer;
 external 'MoveFileExA@kernel32.dll stdcall'; // если dwFlags=1 (MOVEFILE_REPLACE_EXISTING), то файл тоже перезапишется

Подробнее про все эти функции можно читать например на msdn http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Но по-моему эти функции могут не работать, если исходный и конечный файлы находятся на разных дисках.
Или просто используй то, что ребята насоветовали :)

FX-DENIS 21-11-2013 13:24 2259165

El Sanchez,Johny777 здарова. У меня проблемки появились странные.
читать дальше »
Совместил фри арк и скрипт процентов и размера который мне давал Serega.Но вот беда,прогресс бар не отображается

Если изменить на ssPostInstall в скрипте if CurStep = ssInstall then begin //Если необходимо, можно поменять на ssPostInstall
то прогресс бар есть,но тогда сначала устанавливаются все ярлыки и файлы инно,а потом архивы распаковываются.
Связанно это все со строчкой
Код:

if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    CreateControls;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

Убираю строчку WizardForm.ProgressGauge.Hide; ,и получается что прогресс бар инно под баром фри арк вылазит,но после распаковки фри арк нормально отображается.

Я тогда пошел на хитрость и подогнал прогресс бар под бар фри арка по размерам и получилось его как бы не видно.Но это не решение,это по армянски))может есть решение проще,как отображать прогресс бар нормально при if CurStep = ssInstall?
Вторая проблемка

прогресс бар инно именно инно ,не фри арка,показывается 103% а не 100,как это исправить?
Третья проблемка инно не учитывает архивы фри арк и пишет размер только инно,как заставить писать размер места для установки правильно?Смысл тогда в строке #define NeedSize "5000000000" ?

Mat_y 21-11-2013 15:02 2259208

Цитата:

Цитата Shkutu
Из вариантов - копирование вместо перемещения
Код:
function CopyFile(const srcFile, destFile: PansiChar, FailIfExists: boolean): Integer;
external 'CopyFileA@kernel32.dll stdcall'; //если FailIfExists=false, то файл перезапишется
.
Или перемещение вот-так
Код:
function MoveFileEx(const srcFile, destFile: PansiChar, dwFlags: DWORD): Integer;
external 'MoveFileExA@kernel32.dll stdcall'; // если dwFlags=1 (MOVEFILE_REPLACE_EXISTING), то файл тоже перезапишется »

Я попробовал оба варианта... все равно натыкается на существующий фаил и стопорится.

Mat_y 21-11-2013 15:23 2259218

Цитата:

Цитата Johny777
Mat_y, вот накатал копирование файлов из папки куда-нибудь, возможностью перезаписи/пропуска и перемещения файлов в одной функции с опциональным отображением прогресса: »

Сломался на всем этом... пытался, но не осилил.

Johny777 21-11-2013 17:54 2259324

Mat_y,
Цитата:

Цитата Mat_y
Я попробовал оба варианта... все равно натыкается на существующий фаил и стопорится. »

Цитата:

Цитата Mat_y
Сломался на всем этом... пытался, но не осилил. »

Кошмар! :)
Давай по порядку.
Функция вчера почти весь вечер, а ночью дописывалась, хотя это я мог бы и быстрее, но, тк цель одна - максимальная скорость, функциональность и качество,
в ней собственная система определения нужного файла для копирования - это вспомогательные функции из раздела "File Mask Works",
из которых непосредственно во время копирования работает только "ThatFile", для того чтобы найти и в последствии копировать в один цикл прохода по выбранной папке, чтоб
не насиловать ж. диск в количестве длиной с массив масок, как в коде у тебя из сообщения:
for i:=0 to GetArrayLength(MyFiles)-1 do ..., где MyFiles - массив строк (масок поиска)
Перед тем как выложить функцию я её протестировал, хотя составные её части тестировались ещё по мере написания, там где приписано "debug"
Но замечу: я её не перегружал (далее опишу чем), тк не знал насколько это может быть необходимо, тк думал, что тот код которым ты пользуешься не особо хорошо работает.
(не люблю я исправлять, мне проще переписать и потому код твой не брал. Только глянул в чём его назначение)
Те целью было рабочее копирование/перемещение!
"натыкается на существующий фаил и стопорится" может по двум известным мне причинам, если ты конечно папку винды не переносишь :)
1. у файла (который заменяем в папке назначения) свойство "Только чтение"
2. файл держит какой-то процесс
3. хз
эти 3 возможности в коде не учтены, как сказано выше
вывод: дело не в том коде, каким ты пользовался, а в тех самых файлах, которые есть только у тебя, так что нужно максимальное кол-во информации с твоей стороны!


UPD:
вот местами исправленный, улучшенный и дополненный код:

добавлена работа с файлами защиты от изменений ( Read only )
изменён прототип функции. Теперь туда отправляем флаги
SET_OVERWRITE_EXISTING_FILES = 2;
SET_MOVE_FILES = 4;
SET_PROCESS_READONLY_FILES = 8;

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

[Code]
/////////////////////////////////  File Mask Works ////////////////////////
const
   
ALL_FILES = '*';
    BACKSLASH = '\';
type
   
_FILE_MASK = record
       
Parts: array of String;
        PartsCount: Integer;
    end;

    _FILES_MASKS_SHOBLA = record
       
Masks: array of _FILE_MASK;
        MasksCount: Integer;
    end;
procedure Inc(var Int: Integer);
begin
   
Int := Int + 1;
end;
procedure Dec(var Int: Integer);
begin
   
Int := Int - 1;
end;
procedure IncEx(var Int: Extended; const Value: Extended);
begin
   
Int := Int + Value;
end;
procedure DecEx(var Int: Extended; const Value: Extended);
begin
   
Int := Int - Value;
end;
procedure AddFragmentToFileMask(const Fragment: String; var f: _FILE_MASK);
begin
   
Inc(f.PartsCount);
    SetArrayLength(f.Parts, f.PartsCount);
    f.Parts[f.PartsCount-1] := Fragment;
end;
procedure SplitFileMask(const FileMask: String; out f: _FILE_MASK);
var
   
i, Len: Integer;
    Fragment: String;
begin
   
Len := Length(FileMask);   
    Fragment := '';
    for i := 1 to Len do
    begin
        if
FileMask[i] = '*' then
        begin
            if
Fragment <> '' then
            begin
               
AddFragmentToFileMask(Fragment, f);
                Fragment := '';
            end;
            Continue;
        end;
        Fragment := Fragment + FileMask[i];
    end;
    if Fragment <> '' then AddFragmentToFileMask(Fragment, f);
end;
procedure SplitFilesMasks(const FilesMasks: array of String; var f: _FILES_MASKS_SHOBLA);
var
   
i, Len: Integer;
begin
   
Len := GetArrayLength(FilesMasks);
    for i := 0 to Len-1 do
    begin
       
Inc(f.MasksCount);
        SetArrayLength(f.Masks, f.MasksCount);
        SplitFileMask(FilesMasks[i], f.Masks[f.MasksCount-1]);
    end;
end;
function ThatFile(const uFileName: String; const f: _FILES_MASKS_SHOBLA): Boolean;
var
   
a, i: Integer;
begin
    for
a := 0 to f.MasksCount-1 do
    begin
     
Result := True;
      for i := 0 to f.Masks[a].PartsCount-1 do
         
Result := Result and ( Pos(f.Masks[a].Parts[i], uFileName) <> 0 );
      if Result then Break;
    end;
end;
function AllFiles(const Masks: array of String): Boolean;
var
   
Len: Integer;
begin
   
Len := GetArrayLength(Masks);
    case Len of
       
0: Result := True;
        1: Result := Masks[0] = ALL_FILES;
    else
       
Result := False;
    end;
end;
////////////////////////////////////////////////////////////////////////////////////////////
 
const
   
COPY_COLLECTING_INFO = 0;
    COPY_IN_PROGRESS = 1;
    COPY_FINISHED = -1;
   
    SET_OVERWRITE_EXISTING_FILES = 2;
    SET_MOVE_FILES = 4;
    SET_PROCESS_READONLY_FILES = 8;
   
    UNDEF_INT = -1;

    COPY_BLOCK_SIZE = 65536;
   
type
   
_FILE_INFO = record
       
FilePath: String;
        Size: Extended;
    end;
    _FILE_CALLBACK =
    function
   
(
        const Msg: Integer; //сообщение статуса копирования
       
const srcFilePath: String; //путь к текущему исходному файлу
       
const dstFilePath: String; //путь к текущему файлу назначения
       
const FileBytes: Extended; //размер текущего файла в байтах
       
const FileBytesCopied: Extended; //сколько байт текущего файла скопировано
       
const OverallBytes: Extended; //размер всех файлов в байтах
       
const OverallBytesCopied: Extended //сколько байт всех файлов скопировано
   
): Boolean; //чтоб отменить копирование нужно вернуть False
   
function QuadPart(const HighPart: Longint; const LowPart: DWORD): Extended;
begin
   
Result := HighPart * $80000000{2^32} + LowPart;
end;
procedure AddFileInfo
(
    const uFileInfo: TFindRec;
    const uFilePath: String;
    var Files: array of _FILE_INFO;
    var FilesCount: Integer
);
begin
   
Inc(FilesCount);
    SetArrayLength(Files, FilesCount);
    Files[FilesCount-1].FilePath := uFilePath + uFileInfo.Name;
    Files[FilesCount-1].Size := QuadPart(uFileInfo.SizeHigh, uFileInfo.SizeLow);
end;
procedure FindFiles
(
    const srcFolder: String;
    const f: _FILES_MASKS_SHOBLA;
    const FindAll: Boolean;
    var Files: array of _FILE_INFO;
    var FilesCount: Integer;
    var Canceled: Boolean;
    const CallBack: _FILE_CALLBACK
);
var
   
FileInfo: TFindRec;
begin
    if
FindFirst(srcFolder + ALL_FILES, FileInfo) then
    try
        repeat
            if
Canceled then Break;
       
            if (FileInfo.Name <> '.') and (FileInfo.Name <> '..') then
            begin
                if
FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                begin

                    if
FindAll then
                    begin
                       
AddFileInfo(FileInfo, srcFolder, Files, FilesCount);
                        if CallBack <> nil then
                          if not
CallBack
                          (
                              COPY_COLLECTING_INFO,
                              Files[FilesCount-1].FilePath,
                              '',
                              Files[FilesCount-1].Size,
                              UNDEF_INT,
                              UNDEF_INT,
                              UNDEF_INT
                          ) then
                          begin
                             
Canceled := True;
                              Break;
                          end;
                    end
                    else if
ThatFile(FileInfo.Name, f) then
                    begin
                       
AddFileInfo(FileInfo, srcFolder, Files, FilesCount);
                        if CallBack <> nil then
                          if not
CallBack
                          (
                              COPY_COLLECTING_INFO,
                              Files[FilesCount-1].FilePath,
                              '',
                              Files[FilesCount-1].Size,
                              UNDEF_INT,
                              UNDEF_INT,
                              UNDEF_INT
                          ) then
                          begin
                             
Canceled := True;
                              Break;
                          end;
                    end;

                end else if FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
                 
FindFiles(
                      srcFolder + FileInfo.Name + BACKSLASH,
                      f,
                      FindAll,
                      Files,
                      FilesCount,
                      Canceled,
                      CallBack
                  );
            end;
        until not FindNext(FileInfo);

    finally
       
FindClose(FileInfo);
    end;
end;
function CountFilesSize(const Files: array of _FILE_INFO; const FilesCount: Integer): Extended;
var
   
i: Integer;
begin
   
Result := 0;
    for i := 0 to FilesCount-1 do IncEx(Result, Files[i].Size);
end;
function GetNewFilePath(
    const srcFolder: String;
    const dstFolder: String;
    const srcFilePath: String
): String// returns dstFilePath
var
   
BuffFilePath: String;
begin
   
BuffFilePath := srcFilePath;
    StringChange(BuffFilePath, srcFolder, '');
    Result := dstFolder + BuffFilePath;
end;

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function SetFileAttributes(lpFileName: String; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@kernel32.dll stdcall';
function GetFileAttributes(lpFileName: PAnsiChar): DWORD; external 'GetFileAttributes{#A}@kernel32.dll stdcall';

function CopyFiles(
    const srcFolder: String; //путь, откуда копировать
   
const dstFolder: String; //путь, куда откуда копировать
   
const Masks: array of String; //массив масок файла, например: ['*Soft*.exe', '*Soft*a*.exe', 'Valve*.*', '*.e*', '*.exe']
   
const dwOptions: DWORD;
    const CallBack: _FILE_CALLBACK //указатель на функцию обратного вызова _FILE_CALLBACK или nil
): Boolean;
var
   
Files: array of _FILE_INFO;
    f: _FILES_MASKS_SHOBLA;
    FilesCount: Integer;
    CopyAll: Boolean;
   
    Canceled: Boolean;
    ReadOnlyOff, ReadOnlyFile: Boolean;

    OverallBytes, OverallBytesCopied: Extended;

    srcFileStream, dstFileStream: TFileStream;
    dstFilePath, srcFilePath: String;
    i, CopyBytes, BytesLeft: Integer;
   
    CurrentFileDir: String;
begin
   
Result := False;
   
    if not DirExists(srcFolder) then Exit;
   
    Canceled := False;
    ReadOnlyFile := False;

    CopyAll := AllFiles(Masks);
    if not CopyAll then SplitFilesMasks(Masks, f);

    FilesCount := 0;
    FindFiles
    (
        AddBackslash(RemoveBackslash(srcFolder)),
        f,
        CopyAll,
        Files,
        FilesCount,
        Canceled,
        CallBack
    );
    if (FilesCount = 0) or Canceled then Exit;
   
    if CallBack <> nil then
    begin
       
OverallBytes := CountFilesSize(Files, FilesCount);
        OverallBytesCopied := 0;
    end;
   
    for i := 0 to FilesCount-1 do
    begin
        if
Canceled then Break;
       
        srcFilePath := Files[i].FilePath;
        dstFilePath := GetNewFilePath(srcFolder, AddBackslash(RemoveBackslash(dstFolder)), srcFilePath);

        if dwOptions and SET_OVERWRITE_EXISTING_FILES = 0 then
        if
FileExists(dstFilePath) then Continue;
       
        if dwOptions and SET_PROCESS_READONLY_FILES = SET_PROCESS_READONLY_FILES then
          if
FileExists(dstFilePath) then
            if
(GetFileAttributes(dstFilePath) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
            begin
               
ReadOnlyFile := True;
                ReadOnlyOff := SetFileAttributes(dstFilePath, FILE_ATTRIBUTE_NORMAL);
                if not ReadOnlyOff then
                begin
                   
Canceled := True;
                    Break;
                end;
            end;
       
        if not ForceDirectories(ExtractFilePath(dstFilePath)) then
        begin
           
Canceled := True;
            Break;
        end;

        srcFileStream := TFileStream.Create(srcFilePath, fmOpenRead);
        dstFileStream := TFileStream.Create(dstFilePath, fmCreate);
       
        BytesLeft := srcFileStream.Size - srcFileStream.Position;
        CopyBytes := COPY_BLOCK_SIZE;
        try
            while
BytesLeft > 0 do
            begin
                if
BytesLeft < COPY_BLOCK_SIZE then CopyBytes := BytesLeft;
               
                dstFileStream.CopyFrom(srcFileStream, CopyBytes);
               
                BytesLeft := srcFileStream.Size-srcFileStream.Position;

                IncEx(OverallBytesCopied, CopyBytes);
                if CallBack <> nil then
                  if not
CallBack
                  (
                      COPY_IN_PROGRESS,
                      srcFilePath,
                      dstFilePath,
                      Files[i].Size,
                      Files[i].Size - BytesLeft,
                      OverallBytes,
                      OverallBytesCopied
                  ) then
                  begin
                     
Canceled := True;
                      Break;
                  end;
            end;
        finally
           
srcFileStream.Free;
            dstFileStream.Free;

            if ReadOnlyFile then
            begin
               
ReadOnlyOff := not SetFileAttributes(dstFilePath, FILE_ATTRIBUTE_READONLY);
                if ReadOnlyOff then
                 
Canceled := True
                else
                 
ReadOnlyFile := False;
            end;
           
            if Canceled then
             
DeleteFile(dstFilePath);

            if dwOptions and SET_MOVE_FILES = SET_MOVE_FILES then
            begin
               
DeleteFile(srcFilePath);
                CurrentFileDir := ExtractFilePath(srcFilePath);
                if CurrentFileDir <> srcFolder then
                 
RemoveDir(CurrentFileDir); // removes dir if it is empty
           
end;
        end;
    end;

    Result := not Canceled;
    if Result then
      if
CallBack <> nil then
       
CallBack(COPY_FINISHED, '', '', UNDEF_INT, UNDEF_INT, UNDEF_INT, UNDEF_INT);
end;

////////////////////////////////////////////  demo //////////////////////////////////////////////////////////////////
var
   
MainCopyPrgBar,FileCopyPrgBar: TNewProgressBar;
   
    function ____________________
    (
        const Msg: Integer;
        const srcFilePath: String;
        const dstFilePath: String;
        const FileBytes: Extended;
        const FileBytesCopied: Extended;
        const OverallBytes: Extended;
        const OverallBytesCopied: Extended
    ): Boolean;
    begin
        case
Msg of
           
COPY_IN_PROGRESS:
            begin
               
WizardForm.Caption := FloatToStr(FileBytes) + #32#32 + FloatToStr(FileBytesCopied);

                FileCopyPrgBar.Position := Round( (100*FileBytesCopied) / FileBytes );
                MainCopyPrgBar.Position := Round( (100*OverallBytesCopied) / OverallBytes );
            end;
            COPY_FINISHED: MsgBox('Finish! :)', mbInformation, MB_OK);
        end;
       
        Application.ProcessMessages;
       
        Result := not Application.Terminated;
    end;
   

   

procedure ButtonClick(Sender: TObject);
begin
   
CopyFiles('C:\src\', 'C:\test',['*'], SET_PROCESS_READONLY_FILES or SET_OVERWRITE_EXISTING_FILES, @____________________);
end;

procedure InitializeWizard();
begin
   
WizardForm.OuterNotebook.Hide;
    WizardForm.Canvas.Brush.Style := bsClear;
    MainCopyPrgBar := TNewProgressBar.Create(nil);
    with MainCopyPrgBar do
    begin
       
Parent:= WizardForm;
        SetBounds(ScaleX(5), ScaleY(5), WizardForm.ClientWidth-10, ScaleY(20));
    end;
    FileCopyPrgBar := TNewProgressBar.Create(nil);
    with FileCopyPrgBar do
    begin
       
Parent:= WizardForm;
        SetBounds(ScaleX(5), ScaleY(30), WizardForm.ClientWidth-10, ScaleY(20));
    end;

    with TButton.Create(WizardForm) do
    begin
       
Parent:= WizardForm;
        Left := ScaleX(0);
        Top := ScaleY(200);
        Width := ScaleY(150);
        Caption:='Copy';
        OnClick:=@ButtonClick;
    end;
end;



пробуй!

dima.dmitrienko.71@fb 21-11-2013 21:19 2259468

Всем привет ребята помогите выдаёт ошибкуhttp://forum.oszone.net/attachment.p...3&d=1385054354

FX-DENIS 21-11-2013 21:29 2259481

Джони ну помоги пожалуйста,на прошлой стр описал проблемки. Или ткни носом,может уже решение было проблем таких.:)

nik1967 21-11-2013 22:54 2259552

Цитата:

Цитата Dinvin4ester
А мне не поможете ? »

Всё отображается.

habib2302 22-11-2013 14:18 2259849

доброе время суток. как сделать если отсутствует какой-то компонент например DirectX была снята галка с компонента и был не активным

Dinvin4ester 22-11-2013 16:55 2259934

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

El Sanchez 22-11-2013 21:58 2260119

Цитата:

Цитата FX-DENIS
Совместил фри арк и скрипт процентов и размера который мне давал Serega.Но вот беда,прогресс бар не отображается »

FX-DENIS, скажите сначала что нужно на этапе ssInstall (или ssPostInstall) делать. Словами, без кода.

Цитата:

Цитата FX-DENIS
прогресс бар инно именно инно ,не фри арка,показывается 103% а не 100,как это исправить? »

FX-DENIS, это не исправить, в 5 класс школы уже не вернуться. Ищите в скрипте формулу, по которой проценты вычисляются.

Цитата:

Цитата FX-DENIS
Третья проблемка инно не учитывает архивы фри арк и пишет размер только инно,как заставить писать размер места для установки правильно?Смысл тогда в строке #define NeedSize "5000000000" ? »

FX-DENIS, используется, например, так:
Код:

#define NeedSize "5000000000"

[Setup]
#ifdef NeedSize
ExtraDiskSpaceRequired={#NeedSize}
#endif


dima.dmitrienko.71@fb 22-11-2013 23:08 2260145

Помогите решить проблему Файл 107162

El Sanchez 22-11-2013 23:15 2260152

Цитата:

Цитата dima.dmitrienko.71@fb
Помогите решить проблему ffff.png »

dima.dmitrienko.71@fb, где-то выше не закрытый end-ом begin.

dima.dmitrienko.71@fb 22-11-2013 23:43 2260172

El Sanchez извините но я нуб в этом деле можете помочь?

FX-DENIS 23-11-2013 00:20 2260187

Цитата:

Цитата El Sanchez
FX-DENIS, это не исправить, в 5 класс школы уже не вернуться. Ищите в скрипте формулу, по которой проценты вычисляются. »

Санчес причем тут 5 класс то,мне уже под 30 лет)),кроме шуток помоги,формула я так понял это,его писал Serega,он даже есть в шапке,отображение размера файлов и процентов.Вот кусок кода:
Код:

procedure Progress();
begin
  with WizardForm.ProgressGauge do
  ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%';
  SizeLabel.Caption := BytesToReadable(GetFileSize(ExpandConstant(CurrentFileName)), 1);
end;

За размер файлов для установки огромное спасибо,помогло,я не знаю почему в стандартном примере фри арк этого не сказано,что надо такую формулу в SETUP приписать,я так понял там указываеш сумму архивов фри арк,а инно сам плюсует свой размер еще,и получается все правильно
Цитата:

Цитата El Sanchez
FX-DENIS, скажите сначала что нужно на этапе ssInstall (или ssPostInstall) делать. Словами, без кода. »

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

Цитата:

Цитата dima.dmitrienko.71@fb
El Sanchez извините но я нуб в этом деле можете помочь? »

Там перед красной строчкой вставте еще раз end;
Чтоб получилось так
end;
end;

El Sanchez 23-11-2013 15:07 2260409


Цитата:

Цитата FX-DENIS
Санчес причем тут 5 класс то,мне уже под 30 лет)) »

А проценты когда учат? А операции над целыми числами еще раньше.

Цитата:

Цитата FX-DENIS
формула я так понял это,его писал Serega,он даже есть в шапке,отображение размера файлов и процентов.Вот кусок кода: »

FX-DENIS, формула верна, но где гарантия, что Max всегда равен 100? Если он будет меньше, то это вызовет исключение деления на 0, если больше, то на обеих операциях деления будет небольшая погрешность, ибо дробная часть при делении целых чисел в Inno отбрасывается, поэтому 100% не дождешься, будет писать 99%, а это уже вранье в письменной форме. Формулу можно немного переделать, заменя одну операцию деления на умножение: (Position-Min)*100/(Max - Min). Но рискуем нарваться на переполнение, ибо при первом умножении промежуточный результат может выйти за пределы Integer и до свиданья. Поэтому, если мне нужно получить целочисленные проценты, то использую функцию MulDiv:
Код:

function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';

with WizardForm.ProgressGauge do ProgressLabel.Caption := Format('%d %%', [MulDiv(Position-Min, 100, Max-Min)]);

Если с отображением дробной части, то:
Код:

with WizardForm.ProgressGauge do ProgressLabel.Caption := Format('%n %%', [extended(Position-Min)*100/(Max-Min)]);

А насчет того, что вылазит аж 103%, то это где-то Position в коде принимает значения больше Max.

Цитата:

Цитата FX-DENIS
я не знаю как еще на пальцах объяснить »

FX-DENIS, без четкого алгоритма действий на пальцах нет смысла что-то писать на каком-либо языке программирования. ОК, допустим архивы распаковываются на этапе ssInstall, т.е. до основной утановки. Тогда нужно скрыть стандартный прогресс - создать и отобразить интерфейс для freearc - распаковка - удалить/скрыть интерфейс для freearc - показать стандартный прогресс:
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall : begin
           
// тут скрывается стандарный прогрессбар
           
WizardForm.ProgressGauge.Hide;

            // тут создаются конролы для freearc (прогрессбары, проценты, ...)
           
CreateControls;

            // тут идет распаковка
           
...

            // тут удаляются/скрываются контролы для freearc
           
...

            // тут показывается стандарный прогрессбар для основной установки
           
WizardForm.ProgressGauge.Show;
        end;
    end;
end;

Цитата:

Цитата dima.dmitrienko.71@fb
но я нуб в этом деле можете помочь? »

dima.dmitrienko.71@fb, поставьте курсор на строку выше, потом скроллом наверх пока не увидите слово begin, try или case, подсвеченное красным. Этот блок и нужно закрыть end-ом. Не сможете найти сами, код до проблемной строки в студию.

FX-DENIS 23-11-2013 16:50 2260458

Цитата:

Цитата El Sanchez
Если с отображением дробной части, то: »

Поменял строчку на твою и все норм 100.00% ,а первую функцию MulDiv: не смог некуда вставить,добавил бегин и енд,все равно ошибку выдает,ее надо же поместить в procedure Progress();,но не смог.Я просто не понимаю почему дают примеры фри арк людям,и потом еще кучу всего надо переделывать в скрипте,что было по человечески,почему до сих пор нет наглядного конструктора где выбираешь что надо, а скрипт делается автоматически как надо,например как в InnoIDE или Game Script Generator,почему нет такого программиста кто сделает все в одном для простых людей,не понимаю.Обязательно надо кучу разных программ,Dll,и прочего ,чтоб мало мальски заработало.И этот скрипт джойнер для кого выпустили хер знает,после него тока каша получается ,а не скрипт.Не хотят сделать программу для массового пользования. Ну это просто мысли в слух,извини.
Насчет прогресса попробую еще раз скрыть при фри арк,а потом показать при распаковке родной.ВОт почему нельзя было это сделать людям сразу? или они думали скрипт распаковки фри арка,без инно будут использоватЬ?
Вот еще кстати,что хотел спросить,у Serega там написано было так
Код:

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;

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

FX-DENIS 23-11-2013 17:28 2260475

Получается вот так
Код:

begin
  if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    CreateControls;
    WizardForm.ProgressGauge.Show;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;


Но все тоже самое,при распаковке фри арка стандартный бар торчит под ними,а на распаковке отображает себя,WizardForm.ProgressGauge.Hide; не срабатывает

El Sanchez 23-11-2013 18:19 2260498

Цитата:

Цитата FX-DENIS
а первую функцию MulDiv: не смог некуда вставить,добавил бегин и енд,все равно ошибку выдает,ее надо же поместить в procedure Progress();,но не смо »

FX-DENIS, никуда ее в тело процедуры или функции помещать не надо, просто перемести ее в начало секции Code куда-нибудь после объявления констант, типов и глобальных переменных, у тебя там еще подобные объявления функций есть от ISDone, например, (ISArcExtract, IS7ZipExtract и т.д.).
Цитата:

Цитата FX-DENIS
Первая формула закоментированна у него,он даже написал ,что не знает что это,но если использовать без фри арк в дальнейшем,эта формула лучше или он ее закоментировал не даром? »

FX-DENIS, я в предыдущем сообщении указал уже на недостатки обоих примеров. Используй с MulDiv.
Цитата:

Цитата FX-DENIS
Но все тоже самое,при распаковке фри арка стандартный бар торчит под ними,а на распаковке отображает себя,WizardForm.ProgressGauge.Hide; не срабатывает »

FX-DENIS, ну, дык, понятно, что все то же самое. Ты скрыл прогрессбар, вызвал CreateControls, где создаются контролы для freearc, а потом показал прогрессбар ДО распаковки, а нужно ПОСЛЕ. В представленном коде не вижу реализации распаковки.
Цитата:

Цитата habib2302
как сделать если отсутствует какой-то компонент например DirectX была снята галка с компонента и был не активным »

habib2302, где отсутствует?

habib2302 23-11-2013 18:21 2260500

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

FX-DENIS 23-11-2013 20:03 2260540

Цитата:

Цитата El Sanchez
ну, дык, понятно, что все то же самое. Ты скрыл прогрессбар, вызвал CreateControls, где создаются контролы для freearc, а потом показал прогрессбар ДО распаковки, а нужно ПОСЛЕ. В представленном коде не вижу реализации распаковки. »

Вообщем куда тока не вставлял,то ошибки то не работает).Поразмыслил логически и вставил сюда,заработало
Код:

ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
    HideControls;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
  WizardForm.ProgressGauge.Show;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;
 /////////////////////  Конец Фри арка

Вообще я думал надо все это вынести в шапку,ведь это изменение стандартного примера фри арка,остальные люди тоже будут мучаться как я с прогресс баром,с процентами.Можно даже выложить правильный фри арк скрипт от начала до конца в шапку,а тот что дается с ISDone в папке ISDone_Example.iss ,бред полный.Спасибо Санчез ,что помогаешь и терпишь меня:)

habib2302 23-11-2013 22:25 2260597

КТО НИБУДЬ ВООБЩЕ ОТВЕТИТ НА МОЙ ВОПРОС!!!!

Dinvin4ester 23-11-2013 22:50 2260603

habib2302,
Не нервничай, а лучше откатись на 2- 3 страницы назад .Этот вопрос решили , а я спокойно жду . Главное спокойствие .

habib2302 23-11-2013 23:14 2260613

Dinvin4ester, нашел одно сообщение и то на него не ответили!

Johny777 23-11-2013 23:19 2260617

habib2302,
Цитата:

Цитата habib2302
КТО НИБУДЬ ВООБЩЕ ОТВЕТИТ НА МОЙ ВОПРОС!!!! »

а должен кто-то отвечать? с таким твоим отношением я даже не подумаю :)

к тому же тебе был задан вопрос "где отсутствует?", а ты снова пишешь:
Цитата:

Цитата habib2302
например: если отсутствует какой-то компонент »

Dinvin4ester,
Цитата:

Цитата Dinvin4ester
а я спокойно жду »

чего именно?

habib2302 23-11-2013 23:22 2260619

Цитата:

Цитата Johny777
где отсутствует? »

в каком смысле где отсутствует?
DirectX находится рядом с инсталлятором

Johny777 23-11-2013 23:23 2260620

habib2302,
Цитата:

Цитата habib2302
в каком смысле где отсутствует »

в прямом

habib2302 23-11-2013 23:26 2260623

компонент находится рядом с инсталлятором

Dinvin4ester 23-11-2013 23:37 2260628

Johny777,
Помощи с инсталлом . На 149 странице есть мое сообщение .
Цитата:

Ребята , не отображается прогресс бар , не пожете решить эту проблему - http://sendfile.su/897360 . Спасибо .
Там мне ответили , но я не использую сторонних архиваторов - прогресс бара не видно .

dima.dmitrienko.71@fb 24-11-2013 12:47 2260777

Помогите исправить ошибку пожалуйста Файл 107206

El Sanchez 24-11-2013 13:27 2260785

Цитата:

Цитата habib2302
DirectX находится рядом с инсталлятором»

habib2302, ну хоть что-то, я уж было подумал, что DirectX в системе отсутствует и это надо определить, но такая система - труп.
Код:

[Components]
Name: DirectX; Description: DirectX; Types: full; Check: FileExists(ExpandConstant('{src}\directx.exe'))

Цитата:

Цитата Dinvin4ester
Ребята , не отображается прогресс бар , не пожете решить эту проблему »

Dinvin4ester, в процедуре CreateWizardForm вы скрываете OuterNotebook, а значит и InnerPage -> InnerNoteBook -> InstallingPage - > ProgressGauge, поэтому прогрессбар и не виден. Нужно в процедуре ShowComponents на wpInstall родителем прогрессбара сделать форму (WizardForm.ProgressGauge.Parent := WizardForm), а на wpFinished обратно страницу (WizardForm.ProgressGauge.Parent := WizardForm.InstallingPage), ну и координаты подогнать под новый размер формы, ибо форма изменена под фоновую картинку, а размеры и координаты остальных контролов нет.

Dinvin4ester 24-11-2013 15:05 2260825

El Sanchez,
Не получается сделать . Ошибка на ошибке .. Наверное что-то не так делаю .

El Sanchez 24-11-2013 16:11 2260844

Цитата:

Цитата Dinvin4ester
Не получается сделать . Ошибка на ошибке .. Наверное что-то не так делаю . »

Dinvin4ester, в ShowComponents:
Код:

    wpInstalling:
    begin
     
ImgSetVisibility(work5,True);
      StatusLabel.Show;
      IsDoneShow();
      WizardForm.ProgressGauge.Parent := WizardForm;
    end;

    wpFinished:
    begin
     
ImgSetVisibility(work6,True);
      FinishedHeadingLabel.Show;
      FinishedLabel.Show;
      WizardForm.ProgressGauge.Parent := WizardForm.InstallingPage; // или просто WizardForm.ProgressGauge.Hide;
   
end;


nik1967 24-11-2013 17:35 2260889

Цитата:

Цитата Dinvin4ester
Не получается сделать . »

Держи.

Dinvin4ester 24-11-2013 17:42 2260900

El Sanchez,
Спасибо все получилось .
апд
nik1967
огромная благодарность.

Nordek 24-11-2013 17:43 2260901

dima.dmitrienko.71@fb
Цитата:

Цитата dima.dmitrienko.71@fb
извините но я нуб в этом деле можете помочь? »

Как задал вопрос, так тебе и ответили. А чего ты ожидал, что мысленно прочитают твой код и тебе здесь распишут шпаргалку?
Представь себе, что иногда приходится светить своё творение (желательно с содержимым) т.к у помогающих тебе людям есть необходимость сначала его увидеть чтоб потом тебе помочь. Может боишься что если увидят, то украдут?
Кто на него позарится? El Sanchez, nik1967, Johny777, :laugh:? Чтоб потом от ужаса валидол упаковками ели? Им он точно не сдался, мне-то подавно. если только совсем-совсем ламерам пригодится. И чего там не видели, 25 штук "InitializeSetup" в конце кода?
Что-то я всё чаще замечаю что больше попадаются переделки. Т.е каптите под себя чужой скрипт.
Любой толковый скриптер знает, что лучше иметь своё и писать с ноля.

dima.dmitrienko.71@fb 24-11-2013 18:24 2260928

Серавно не работает добавляю перед строчной end серавно не работает.

nik1967 24-11-2013 18:47 2260938

del.

Serega 24-11-2013 19:34 2260968

Всем привет :)
Цитата:

Цитата El Sanchez
но где гарантия, что Max всегда равен 100? »

Там мы высчитываем проценты, соответственно более 100% быть не может и не важно сколько равно Max.
Ну да ладно, каждый ищет для себя свой путь решения той или иной задачи.

Обнаружил неприятный глюк inno, а именно работа с Extended, раньше такого не наблюдал, может быть просто не сталкивался:
Код:

function InitializeSetup(): Boolean;
var
  a: Integer;
  b: Integer;
  e: Extended;
begin
  a := 200;
  b := 71;
  e := a/b;
#ifdef UNICODE
  // косяк вычисления
  MsgBox('UNICODE версия:' + #13#10 + IntToStr(a) + '/' + IntToStr(b) + '=' + FloatToStr(e), mbInformation, MB_OK);
  // правильный вариант вычисления до сотых (100), нужна точность больше, заменить 100 на 1000 или на то количество нулей которое нужно после запятой
  e := StrToFloat(IntToStr(a div b) + '.' + IntToStr((a - (a div b) * b) * 100 div b));
  MsgBox('UNICODE версия:' + #13#10 + IntToStr(a) + '/' + IntToStr(b) + '=' + FloatToStr(e), mbInformation, MB_OK);
#else
  // здесь вроде всё нормально
  MsgBox('Ansi версия, работа через переменные:' + #13#10 + IntToStr(a) + '/' + IntToStr(b) + '=' + FloatToStr(e), mbInformation, MB_OK);
  // косяк вычисления
  MsgBox('Ansi версия, косяк при работе без переменных:' + #13#10 + '200/71=' + FloatToStr(200/71), mbInformation, MB_OK);
#endif
end;

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

dima.dmitrienko.71@fb 24-11-2013 19:56 2260982

Помогите решить проблему Файл 107215
читать дальше »
;
//ArcExtract - распаковка архивов freearc
//ZipExtract - распаковка zip, 7z, tar архивов
//PCFExtract - распаковка pcf (файлы precomp)
//NextDisk - запрос следующего диска
//SrepExtract - распаковка архивов srep
//RepExtract - рапаковка архивов rep
//OggDecode - ogg to wav
//TakDecode - tak to wav
//ZipPak - упаковка zip, 7z архивов

//в каждом параметре прописано число - это шаг прогресс бара(можно изменить на любое)
//исходя из количества распаковываемой инфы указываем IsExtractBarMax - максимальное значение прогресс бара(всегда прибавляем 10, это для временных файлов)
//пример у нас два архива зип 10+10 и еще для времменных файлов +10 и того 30. значит указываем так - IsExtractBarMax "30"
//или например у нас одын фриарковый архив и в нем 5 огг файлов для конвертирования, получаем 10 + 5*5 =35 и прибавлем 10 для времменных файлов.

//чисто математика )
#define Pic1 "5"
#define Pic2 "9"
#define Pic3 "8"


#define ArcExtract "17"
#define ZipExtract "0"
#define SrepExtract "0"
#define RepExtract "0"
#define PrecompExtract "0"
#define OggDecode "0"
#define TakDecode "0"
#define ZipPak "0"

#define IsExtractBarMax "17"

;; ниже имя игры
#define MyAppName "World_of_Tanks"
;; ниже версия
#define MyAppVersion "1.0"
;; ниже автор
#define MyAppPublisher "The KillerMak"
;; ниже имя exe файла, на кторорый ссылается ярлык
#define MyAppExeName "WotLa.exe"
;; ниже версия, которая записывается в свойствах
#define vers1 "1.1.1.2"
;; ниже сколько требуется места на установку, в МБ
#define NeedSize1 "16000"
;Цвет инсталятора
#define colour "clblack"

[Setup]
AppName={#MyAppName}
AppverName={#MyAppVersion}
AppVersion={#MyAppVersion}
VersionInfoVersion={#vers1}
VersionInfoTextVersion={#vers1}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
WizardSmallImageFile=Files\WizardSmallImage.bmp
SetupIconFile=Files\icon.ico
WizardImageFile=Files\WizardImg.bmp
ShowTasksTreeLines=yes
OutputDir=Output
AllowCancelDuringInstall=no

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

[CustomMessages]
rus.WelcomeLabel1=
rus.WelcomeLabel2=
rus.FinisLabel1=
rus.FinisLabel2=

rus.Tasks1=Установить &PhysX
rus.Tasks2=Установить &Microsoft Visual C++ Redist
rus.Tasks3=Обновить &DirectX (требуется интернет соединение)
rus.Prog=Дополнительное программное обеспечение:

rus.NeedSpace=Требуется места на диске:
rus.FreeSpace=Доступно места на диске:

rus.ru1=В пути установки присутствуют русские буквы, что недопустимо.
rus.ru2=Пожалуйста, повторите ввод.

[Tasks]
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Run]
[Components]
Name: "mon12"; Description: "1.Удобные прицелы:";
Name: "mon\1"; Description: "Прицел от Джова"; Flags: exclusive
Name: "mon\2"; Description: "Прицел от Кирилла Орешкина"; Flags: exclusive
Name: "mona"; Description: "2.УГН.Углы горизонтальной наводки.:"; Types:
Name: "mona\1"; Description: "Уголком"; Flags: exclusive
Name: "mona\2"; Description: "Полукругом"; Flags: exclusive
Name: "mona789789"; Description: "3.Удаление черноты в снайперском режиме.:"; Types:
Name: "mona3"; Description: "4.Панель повреждений.:"; Types:
Name: "mona\3"; Description: "Простай с уроном."; Flags: exclusive
Name: "mona\4"; Description: "Боевой интерфейс от игрока zayaz."; Flags: exclusive
Name: "monaa3"; Description: "5.Настраиваемое меню команд.:"; Types:
Name: "mona33"; Description: "6.Командирская камера.:"; Types:
Name: "mona333"; Description: "7.Зум в снайперчком прицеле.:"; Types:
Name: "mona3333"; Description: "8.Цветные пробитая танка.:"; Types:
Name: "mona33334"; Description: "9.Подробное описаний умений и навыков.:"; Types:
//Name: "mona333345"; Description: "10.Автоматическая стрельба после перезарядки орудия.:"; Types:

//Name: "mon\17896"; Description: "Стандартный xvm"; Flags: exclusive
//Name: "mon\169"; Description: "xvm с Оленимером"; Flags: exclusive
Name: "mon\17896"; Description: "10.Комплесный мод xvm.:";Types:
Name: "mona12"; Description: "11.Улутшение освещение(+fps).:"; Types:
//Name: "mona1244"; Description: "Часы в ангаре.:"; Types:
Name: "mona12222"; Description: "12.Статистика за сесию(за весь день).:"; Types:

[Files]
Source: "E:\WG\2\Прицел джов\*"; DestDir: "{app}"; Components: mon\1; Flags: recursesubdirs
Source: "E:\WG\2\Приыел от кирила орешкина\*"; DestDir: "{app}"; Components: mon\2; Flags: recursesubdirs
Source: "E:\WG\2\Угн Уголком\*"; DestDir: "{app}"; Components: mona\1; Flags: recursesubdirs
Source: "E:\WG\2\угн полукругом\*"; DestDir: "{app}"; Components: mona\2; Flags: recursesubdirs
Source: "E:\WG\2\Удаление черноты\*"; DestDir: "{app}"; Components: mona789789; Flags: recursesubdirs
Source: "E:\WG\2\Дамаг панель\*"; DestDir: "{app}"; Components: mona\3; Flags: recursesubdirs
Source: "E:\WG\2\интерфейс от зайца\*"; DestDir: "{app}"; Components: mona\4; Flags: recursesubdirs
Source: "E:\WG\2\Настраиваемое меню команд для World of Tanks\*"; DestDir: "{app}"; Components: monaa3; Flags: recursesubdirs
Source: "E:\WG\2\отдаление\*"; DestDir: "{app}"; Components: mona33; Flags: recursesubdirs
Source: "E:\WG\2\зум\*"; DestDir: "{app}"; Components: mona333; Flags: recursesubdirs
Source: "E:\WG\2\Цветные пробития\*"; DestDir: "{app}"; Components:mona3333; Flags: recursesubdirs
Source: "E:\WG\2\Описание навыков\*"; DestDir: "{app}"; Components:mona33334; Flags: recursesubdirs
//Source: "E:\WG\2\Автоматическая стрельба после перезарядки орудия\*"; DestDir: "{app}"; Components: mona333345; Flags: recursesubdirs
Source: "E:\WG\2\xvm\*"; DestDir: "{app}"; Components: mon\17896; Flags: recursesubdirs
//Source: "E:\WG\2\оленимер\*"; DestDir: "{app}"; Components: mon\169; Flags: recursesubdirs
Source: "E:\WG\2\Улошение графики\*"; DestDir: "{app}"; Components: mona12; Flags: recursesubdirs
//Source: "E:\WG\2\Часы в ангаре\*"; DestDir: "{app}"; Components: mona1244; Flags: recursesubdirs
Source: "E:\WG\2\сесия\*"; DestDir: "{app}"; Components: mona12222; Flags: recursesubdirs
Source: Files\logo.bmp; Flags: dontcopy
Source: Files\BASS.dll; Flags: dontcopy
Source: Files\sound.mp3; Flags: dontcopy nocompression
Source: Files\MusicButton.bmp; Flags: dontcopy
Source: Files\DirBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy
Source: Files\GroupBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy
Source: Files\{#Pic1}.bmp; Flags: dontcopy
Source: Files\{#Pic2}.bmp; Flags: dontcopy
Source: Files\{#Pic3}.bmp; Flags: dontcopy
///////////////////////////////////////////////////////Файлы для распаковки======================================================================

;;-----------------------------------------------------------///////////////////////////--------------------------------------------------------

[Icons]


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

[code]
#ifdef colour
const
Color = {#colour}; //===Цвет инсталятора=======
#endif
//-------------------------------------------Начало распаковка файлов--------------------------------------------------------------------
var
IsExtractProgressbar: TNewProgressBar;
ArcRes: Extended;
Folder: String;
ArcCount: Boolean;
FolderSize: Integer;

//------------------------------------------------------------//
procedure InitializeWizard2();
begin
IsExtractProgressbar:=TNewProgressBar.Create(WizardForm);
with IsExtractProgressbar do begin
Parent:=WizardForm.ProgressGauge.Parent;
SetBounds(WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top ,
WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height);
Max:={#IsExtractBarMax};
end;
end;
//------------------------------------------------------------//

//====================//
#include "Files\include.iss"
//====================//

//------------------------------------------------------------//
procedure IsExtract();
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
WizardForm.CancelButton.Enabled:=false;

//распаковка временных файлов==========================



//распаковка архивов=======================================




//ArcExtract(ExpandConstant('{src}\data-g.bin'), ExpandConstant('{app}'));

(* дальше идут различные примеры
//DeleteFile(ExpandConstant('{app}\data-c.tar'));

ZipPak('-tzip', '-mx0', ExpandConstant('{app}\pak.zip'), ExpandConstant('{app}\data'));
ZipPak('-t7z', '-mx3', ExpandConstant('{app}\pak.7z'), ExpandConstant('{app}\data'));

ArcExtract(ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'));
ArcExtract(ExpandConstant('{app}\data.arc'), ExpandConstant('{app}\files'));

ZipExtract(ExpandConstant('{src}\tak.7z'), ExpandConstant('{app}'));
ZipExtract(ExpandConstant('{src}\tak.zip'), ExpandConstant('{app}'));

SrepExtract(ExpandConstant('{app}\srep.srp'), ExpandConstant('{app}\srep.dat'));

RepExtract(ExpandConstant('{app}\rep.rep'));

NextDisk(2, ExpandConstant('{src}\setup-2.arc'));

PcfExtract (ExpandConstant('{app}\precomp.pcf'), ExpandConstant('{app}\file.tart')); //precomp
OggDecode; //Ogg
TakDecode; //TAK

*)
WizardForm.ProgressGauge.Hide;
end;

//------------------------------------------------------------//
procedure CurStepChanged2(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
IsExtract();
end;
end;

//------------------------------------------------------------//
procedure CurPageChanged2(CurPageID: Integer);
begin
case CurPageID of
wpFinished: begin
WizardForm.NextButton.Left:=WizardForm.CancelButton.Left;
end;
end;
end;
////////////////////////////////////////////////////////////////////Конец распаковка файлов///////////////////////////////////////////////////////////////

//==================================================================Начало разметка формы=================================================================
var
FLabel1, FLabel2, WLabel1, WLabel2, PageNameLabel, PageDescriptionLabel,NeedSpaceLabel,FreeSpaceLabel: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
LogoImage: TBitmapImage;

ProgressBar1:TNewProgressBar;

const SmallWidth = 497;
//////---------------------------------------------------- музыка в инсталяторе
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;
AppPath: string;

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
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
end;
procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
PauseImage.Left := -32
end;

procedure PlayButtonOnClick(Sender: TObject);
begin
case BASS_ChannelIsActive(mp3Handle) of
BASS_ACTIVE_PAUSED:
begin
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 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


end;

function InitializeSetup1(): 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 DeinitializeSetup1();
begin
BASS_Stop();
BASS_Free();
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:FreeSpace}')+ ' ' + FloatToStr(round(FreeMB/1024*100)/100) + ' Gb' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSpace}') + ' ' + 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 := ExpandConstant('{cm:NeedSpace}') + ' ' + FloatToStr(round(NeedSize/1024*100)/100) + ' Mb' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace}') + ' ' + IntToStr(NeedSize)+ ' Mb';
end;

procedure InitializeWizard1();
begin
with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;
ProgressGauge.Hide;
FileNameLabel.Hide;
StatusLabel.Top:=ScaleY(20);
WizardForm.DiskSpaceLabel.Hide;
end;

with WizardForm do
begin
WizardBitmapImage.Width := ScaleY (498);
WizardBitmapImage.Height := ScaleX (314);
WizardBitmapImage2.Width := ScaleY (498);
WizardBitmapImage2.Height := ScaleX (314);
WizardSmallBitmapImage.Left:= WizardForm.WizardSmallBitmapImage.Left - (SmallWidth - WizardForm.WizardSmallBitmapImage.Width) + 2 WizardSmallBitmapImage.Width:= SmallWidth
end;

begin
WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := ScaleX(40);
WLabel1.Top := ScaleY(150);
WLabel1.Width := ScaleX(240);
WLabel1.Height := ScaleY(100);
WLabel1.AutoSize := False;
WLabel1.WordWrap := True;
WLabel1.Font.Size := 8;
WLabel1.Font.Style := [fsBold];
WLabel1.Font.Color:= clWhite;
WLabel1.Font.Name:= 'Comic Sans MS'
WLabel1.ShowAccelChar := False;
WLabel1.Caption :=ExpandConstant('{cm:WelcomeLabel1}');
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.WelcomePage;

WLabel2 :=TLabel.Create(WizardForm);
WLabel2.Top := ScaleY(190);
WLabel2.Left := ScaleX(40);
WLabel2.Width := ScaleX(240);
WLabel2.Height := ScaleY(234);
WLabel2.AutoSize := False;
WLabel2.WordWrap := True;
WLabel2.Font.Size := 8;
WLabel2.Font.Style := [fsBold];
WLabel2.Font.Color:= clWhite;
WLabel2.Font.Name:= 'Comic Sans MS'
WLabel2.ShowAccelChar := False;
WLabel2.Caption := ExpandConstant('{cm:WelcomeLabel2}');
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.WelcomePage;

FLabel1 := TLabel.Create(WizardForm);
FLabel1.Left := ScaleX(40);
FLabel1.Top := ScaleY(150);
FLabel1.Width := ScaleX(240);
FLabel1.Height := ScaleY(54);
FLabel1.AutoSize := False;
FLabel1.WordWrap := True;
FLabel1.Font.Size := 8;
FLabel1.Font.Name := 'Comic Sans MS'
FLabel1.Font.Style := [fsBold];
FLabel1.Font.Color:= clWhite;
FLabel1.ShowAccelChar := False;
FLabel1.Caption := ExpandConstant('{cm:FinisLabel1}');
FLabel1.Transparent := True;
FLabel1.Parent := WizardForm.FinishedPage;

FLabel2 :=TLabel.Create(WizardForm);
FLabel2.Top := ScaleY(190);
FLabel2.Left := ScaleX(40);
FLabel2.Width := ScaleX(240);
FLabel2.Height := ScaleY(77);
FLabel2.AutoSize := False;
FLabel2.WordWrap := True;
FLabel2.Font.Size := 8;
FLabel2.Font.Name := 'Comic Sans MS'
FLabel2.Font.Style := [fsBold];
FLabel2.Font.Color:= clWhite;
FLabel2.ShowAccelChar := False;
FLabel2.Caption := ExpandConstant('{cm:FinisLabel2}');
FLabel2.Transparent := True;
FLabel2.Parent := WizardForm.FinishedPage;
end;

PageNameLabel:= TLabel.Create(WizardForm);
with PageNameLabel do
begin
SetBounds(WizardForm.PageNameLabel.Left, WizardForm.PageNameLabel.Top, WizardForm.PageNameLabel.Width - 32, WizardForm.PageNameLabel.Height)
AutoSize:= False; WordWrap:= True; Transparent:= True;
Font.Color:= clWhite;
Font.Style:= WizardForm.PageNameLabel.Font.Style;
Parent:= WizardForm.MainPanel;
end;

PageDescriptionLabel:= TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
SetBounds(WizardForm.PageDescriptionLabel.Left, WizardForm.PageDescriptionLabel.Top, WizardForm.PageDescriptionLabel.Width - 32, WizardForm.PageDescriptionLabel.Height)
AutoSize:= False; WordWrap:= True; Transparent:= True;
Font.Color:= clWhite;
Font.Style:= WizardForm.PageDescriptionLabel.Font.Style;
Parent:= WizardForm.MainPanel;
end;

Music //музыка в инсталяторе
NeedSize := {#NeedSize1};

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;
with WizardForm do
begin
DirEdit.OnChange := @GetFreeSpaceCaption;
DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

ProgressBar1:=TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar1.Left := WizardForm.ProgressGauge.Left;
ProgressBar1.Top := WizardForm.ProgressGauge.Top;
ProgressBar1.min:=0;
ProgressBar1.Width :=WizardForm.ProgressGauge.Width;
ProgressBar1.Height := WizardForm.ProgressGauge.Height;
ProgressBar1.Parent := WizardForm.InstallingPage;
ProgressBar1.Max:=4;
end;


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

end;
end;


Procedure CurPageChanged1(CurPageID: Integer);
Begin
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;

begin
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;end;
end;
//=======================================Конец разметка формы=======================================

function NextButtonClick1(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 := ExpandConstant('{cm:ru1}')+#13#13+ExpandConstant('{cm:ru2}');
MsgBox(s, mbError, mb_Ok);
Result := False ; //Запрет перехода на следующую страницу
exit;
end
else Result := True; //Разрешаем переход на следующую страницу
end;
end;
end;
// --- Конец скрипта ------------------------------------------------------------
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
end;

procedure DeinitializeSetup();
begin
DeinitializeSetup1();
end;

procedure InitializeWizard();
begin
//=================================================Начало папки=======================================
ExtractTemporaryFile('DirBitmap.bmp');
ExtractTemporaryFile('GroupBitmap.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\DirBitmap.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;

WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\GroupBitmap.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
//===================================Конец папки=====================
/////////////////////////////////Шрифт в сетапе////////////////////////////
WizardForm.Font.Name:= 'Comic Sans MS';
/////////////////////////////////Конец шрифт в сетапе//////////////////////
/////////////////////////////////////Чёрный инсталятор///////////////////////////////////////////////////
#ifdef colour
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.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
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.PageNameLabel.Font.Color:=clWhite;
end;
procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Прицелы': UndefPic := '{#Pic1}.bmp';
'Арт-Прицелы': UndefPic := '{#Pic2}.bmp';
'Панели повреждений': UndefPic := '{#Pic3}.bmp';

else
begin
LastIndex := UNDEF_INDEX;
PicForm.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
PicForm.Hide;
end;


procedure InitInfo();
begin
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;
PicForm := TForm.Create(WizardForm)
with PicForm do
begin
BorderStyle := bsNone;
FormStyle := fsStayOnTop;
InfoPic := TBitmapImage.Create(PicForm)
with InfoPic do
begin
Parent := PicForm;
AutoSize := True;
end;
end;
end;
#endif
//////////////////////////////////////////////Конец чёрный инсталятор///////////////////////////////////////////////////////////////

InitializeWizard1();
InitializeWizard2();
end;


procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
CurPageChanged2(CurPageID);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := NextButtonClick1(CurPageID); if not Result then exit;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
CurStepChanged2(CurStep);
end;

Serega 24-11-2013 20:26 2260998

Цитата:

Цитата dima.dmitrienko.71@fb
Помогите решить проблему ffff.png »

уберите begin в этих строках:
Код:

WizardForm.Font.Name:= 'Comic Sans MS';
/////////////////////////////////Конец шрифт в сетапе//////////////////////
/////////////////////////////////////Чёрный инсталятор///////////////////////////////////////////////////
#ifdef colour
begin
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;

А именно, удалите строку 714, на этой строке у меня begin

FX-DENIS 25-11-2013 12:29 2261288

Цитата:

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

Код:

#ifdef UNICODE
  // косяк вычисления
  MsgBox('UNICODE версия:' + #13#10 + IntToStr(a) + '/' + IntToStr(b) + '=' + FloatToStr(e), mbInformation, MB_OK);
  ////////Версия 1////// правильный вариант вычисления до сотых (100), нужна точность больше, заменить 100 на 1000 или на то количество нулей которое нужно после запятой
  e := StrToFloat(IntToStr(a div b) + '.' + IntToStr((a - (a div b) * b) * 100 div b));
  MsgBox('UNICODE версия:' + #13#10 + IntToStr(a) + '/' + IntToStr(b) + '=' + FloatToStr(e), mbInformation, MB_OK);
#else.  ///////////// Версия 2?

Здарова Серега,тока вспоминали о тебе недавно.Попробовал оба варианта,там в начале сообщение появляется 200/71=и у обоих вариантов разные значения.А на счет процентов так же и осталось 103%))Хотя версия Санчеса 100.00% работает,единственный недостаток нули,ну тут нечего не поделаешь.Я так понял это как пример ты дал,формула деления прогресса,а можешь ее реализовать тут- как пример:
Код:

procedure Progress();
begin
  with WizardForm.ProgressGauge do
  ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%';
  SizeLabel.Caption := BytesToReadable(GetFileSize(ExpandConstant(CurrentFileName)), 1);
end;


Serega 25-11-2013 13:36 2261312

Цитата:

Цитата FX-DENIS
тока вспоминали о тебе недавно »

Я лучше промолчу...
Цитата:

Цитата FX-DENIS
появляется 200/71=и у обоих вариантов разные значения »

Про это именно и писал, что глюк при вычислении.
Цитата:

Цитата FX-DENIS
А на счет процентов так же и осталось 103%))Хотя версия Санчеса 100.00% работает,единственный недостаток нули,ну тут нечего не поделаешь.Я так понял это как пример ты дал,формула деления прогресса,а можешь ее реализовать тут- как пример »

Что-то я не совсем понял, я как-то писал:
Код:

    ProgressLabel.Caption := IntToStr((Position*100)/Max) + '%'; // правильное отображение процентов
и в таком варианте у вас появляется 103% ? Здесь же составляется элементарная пропорция, т.е. Max = 100%, Position = x, от сюда получается x=(Position*100)/Max

habib2302 25-11-2013 14:13 2261326

Доброе время суток. Как добавить переключатель языков инсталлятора

nik1967 25-11-2013 16:31 2261406

habib2302, я выкладывал пример несколько страниц назад. А так, как реализовано у нас - не для паблика.

habib2302 25-11-2013 16:52 2261414

nik1967, только не все переводит!!!

nik1967 25-11-2013 16:55 2261416

habib2302, естественно - это же только пример. Чтобы было переведено - нужно переписывать все лейблы, сообщения и всё остальное.

FX-DENIS 25-11-2013 17:54 2261444

Цитата:

Цитата Serega
и в таком варианте у вас появляется 103% ? Здесь же составляется элементарная пропорция, т.е. Max = 100%, Position = x, от сюда получается x=(Position*100)/Max »

Да,если с фри арком скрипт,все что ты давал стандартный прогресс показывает 103%.Санчез помог дав альтернативные варианты ,где пишется с нолями 100.00%.
Цитата:

Цитата Serega
Я лучше промолчу... »

А что тебя так напрягает?что я о тебе вспомнил?Ты же мне много помогал всегда тут.

Serega 25-11-2013 19:20 2261493

Цитата:

Цитата FX-DENIS
все что ты давал стандартный прогресс показывает 103% »

Единственное объяснение, это только глюк инно, т.е. Position становится больше Max, математически формула верна. В любом случае, у меня ни разу не было более 100%

Shkutu 25-11-2013 20:09 2261530

Доброго времени суток!
Может кто-то подскажет, с помощью чего лучше осуществлять взаимодействие inno setup и ms sql server 12 (разворачивать базу, выполнять запросы)?
Есть sqlcmd.exe, но это работает только для 64-битной системы. Версию этой утилиты для 32х битной найти не могу:(
Может, кто-то знает, где взять или подскажет, чем можно заменить?

Optitron 25-11-2013 20:18 2261537

Здравствуйте. Нужна помощь. Не удается страницу "компоненты" поставить перед объединенной страницой папки установки и меню пуск, вот скрипт

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

[Setup]
DisableReadyPage=yes
DisableProgramGroupPage=true

[Components]
Name: 1; Description: 1; Flags: exclusive; Types: custom compact full
Name: 2; Description: 2; Flags: exclusive;
Name: 3; Description: 3; Flags: exclusive;


[code]
procedure InitializeWizard();
begin
//проблема начинается тут
WizardForm.SelectedComponentsBitmapImage.Parent := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsLabel.Parent := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsBrowseLabel.Parent := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsSelectComponentsLabel2 := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsFullInstallation := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsCompactInstallation := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsCustomInstallation := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsNoUninstallWarningTitle := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsNoUninstallWarning := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsComponentSize1 := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsComponentSize2 := WizardForm.SelectDirPage;
WizardForm.SelectedComponentsComponentsDiskSpaceMBLabel := WizardForm.SelectDirPage;
//конец проблемы

WizardForm.ComponentsList.Top := ScaleY(45);
WizardForm.ComponentsList.Height := ScaleY(160);
WizardForm.TypesCombo.Visible := False;

WizardForm.DiskSpaceLabel.Top := ScaleY(65);
WizardForm.DirBrowseButton.Top := ScaleY(36);
WizardForm.DirEdit.Top := ScaleY(37);
WizardForm.NoIconsCheck.Parent := WizardForm.SelectDirPage;
WizardForm.SelectDirLabel.Top := ScaleX(09)
WizardForm.SelectDirBitmapImage.Top := ScaleY(0)
WizardForm.SelectDirBrowseLabel.Visible := False
WizardForm.SelectGroupBitmapImage.Top := ScaleY(95);
WizardForm.SelectGroupBitmapImage.Parent := WizardForm.SelectDirPage;
WizardForm.GroupBrowseButton.Parent := WizardForm.SelectDirPage;
WizardForm.GroupBrowseButton.Top := ScaleY(133);
WizardForm.GroupEdit.Parent := WizardForm.SelectDirPage;
WizardForm.GroupEdit.Top := ScaleY(134);
WizardForm.SelectStartMenuFolderBrowseLabel.Parent := WizardForm.SelectDirPage;
WizardForm.SelectStartMenuFolderBrowseLabel.Top := ScaleY(170);
WizardForm.SelectStartMenuFolderLabel.Parent := WizardForm.SelectDirPage;
WizardForm.SelectStartMenuFolderLabel.Top := ScaleY(105);
end;

El Sanchez 25-11-2013 23:11 2261626

Цитата:

Цитата FX-DENIS
.Санчез помог дав альтернативные варианты ,где пишется с нолями 100.00%. »

FX-DENIS, если не нужна дробная часть, в функции Format в первом параметре поставить точку, чтобы получилось '%.n %%'.
Цитата:

Цитата Shkutu
Версию этой утилиты для 32х битной найти не могу »

Shkutu, http://go.microsoft.com/fwlink/?Link...49&clcid=0x419

Nordek 26-11-2013 04:49 2261691

Цитата:

Цитата Optitron
Не удается страницу "компоненты" поставить перед объединенной страницой папки установки и меню пуск »

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

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

[Messages]
russian.WizardSelectDir=Выбор компонентов
russian.SelectDirDesc=Какие компоненты должны быть установлены?
russian.WizardSelectComponents=Выбор папки установки
russian.SelectComponentsDesc=В какую папку вы хотите установить [name]?
default.WizardSelectDir=Select Components
default.SelectDirDesc=Which components should be installed?
default.WizardSelectComponents=Select Destination Location
default.SelectComponentsDesc=Where should [name] be installed?

[Code]
procedure InitializeWizard();
 begin
 
WizardForm.ComponentsList.Top := ScaleY(45);
  WizardForm.ComponentsList.Height := ScaleY(160);
  WizardForm.TypesCombo.Visible := False;
  WizardForm.DiskSpaceLabel.Parent := WizardForm.SelectComponentsPage;
  WizardForm.DiskSpaceLabel.Top := ScaleY(65);
  WizardForm.DirBrowseButton.Parent := WizardForm.SelectComponentsPage;
  WizardForm.DirBrowseButton.Top := ScaleY(36);
  WizardForm.DirEdit.Parent := WizardForm.SelectComponentsPage;
  WizardForm.DirEdit.Top := ScaleY(37);
  WizardForm.NoIconsCheck.Parent := WizardForm.SelectComponentsPage;
  WizardForm.NoIconsCheck.Parent := WizardForm.SelectComponentsPage;
  WizardForm.SelectDirLabel.Parent := WizardForm.SelectComponentsPage;
  WizardForm.SelectDirLabel.Top := ScaleX(09)
  WizardForm.SelectDirBitmapImage.Parent := WizardForm.SelectComponentsPage;
  WizardForm.SelectDirBitmapImage.Top := ScaleY(0)
  WizardForm.SelectDirBrowseLabel.Parent := WizardForm.SelectComponentsPage;
  WizardForm.SelectDirBrowseLabel.Visible := False
  WizardForm.SelectGroupBitmapImage.Parent := WizardForm.SelectComponentsPage;
  WizardForm.SelectGroupBitmapImage.Top := ScaleY(95);
  WizardForm.GroupBrowseButton.Parent := WizardForm.SelectComponentsPage;
  WizardForm.GroupBrowseButton.Top := ScaleY(133);
  WizardForm.GroupEdit.Parent := WizardForm.SelectComponentsPage;
  WizardForm.GroupEdit.Top := ScaleY(134);
  WizardForm.SelectStartMenuFolderBrowseLabel.Parent := WizardForm.SelectComponentsPage;
  WizardForm.SelectStartMenuFolderBrowseLabel.Top := ScaleY(170);
  WizardForm.SelectStartMenuFolderLabel.Parent := WizardForm.SelectComponentsPage;
  WizardForm.SelectStartMenuFolderLabel.Top := ScaleY(105);
  WizardForm.ComponentsDiskSpaceLabel.Parent := WizardForm.SelectDirPage;
  WizardForm.ComponentsList.Parent := WizardForm.SelectDirPage;
  WizardForm.TypesCombo.Parent := WizardForm.SelectDirPage;
  WizardForm.SelectComponentsLabel.Parent := WizardForm.SelectDirPage;
 end;

При переставлении страниц, ещё нужно проводить манипуляции в [Messages] иначе в MainPanel белиберда будет.

Shkutu 26-11-2013 13:05 2261816

El Sanchez, спасибо!:)

icetanker 26-11-2013 17:46 2261946

парни,спасайте
есть готовый javascript,в котором выполняется настройки браузера и надежных узлов,так же 3 файла,которые выполняются в скрипте .bat, reg, msi,нужно ,чтобы запускался скрипт с помощью установщика,сделал задачу через sfx архив,но хотелось бы сделать красивый установщик,решил сделать через inno setup,сейчас получается,что Myprogram(установщик,который я собрал) устанавливается,после этого только запускается сам файл,зачем лишняя программа нужна,а цель моей настроить браузер и установить msi,а я хотел бы,чтобы сразу запускался мой скрипт,который я сделал через sfx и был бар прогресса
подскажите,как мне сделать такой установщик?

FX-DENIS 27-11-2013 10:40 2262291

Цитата:

Цитата icetanker
мой скрипт,который я сделал через sfx и был бар прогресса
подскажите,как мне сделать такой установщик? »

Код:

//////////////sfx архив расположен  внутри
[Files]
Source: "sfx.exe"; DestDir: "{app}"; AfterInstall: MyAfterInstall; Flags: ignoreversion deleteafterinstall

///////Секция CODE
procedure MyAfterInstall();
var
ResultCode: Integer;
begin
begin
Exec(ExpandConstant('{app}\sfx.exe'), '-e -aoa -y', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end
end;

Код:

///////////Архив SFX снаружи возле Setup.exe
[Files]
Source: "{src}\Rus\NFSMWRUS.exe"; DestDir: "{app}"; Flags: ignoreversion external deleteafterinstall
[Run]
Filename: "{app}\NFSMWRUS.exe"; WorkingDir: "{app}"; Parameters: "-y"; StatusMsg: "Процесс руссификации..."; Flags: waituntilterminated skipifdoesntexist

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

icetanker 27-11-2013 11:10 2262306

спасибо,а можно ли сделать так.чтобы создавалась временная папка и удалялась,он бы выполнял настройку браузера и устанавливал программу parser,которая вшита в sfx архив
или перефразирую,мой sfx архив предназначен для настройки браузера и установки msxml parser
то есть при нажатие на него устанавливается только парсер,а настройки просто проставляются,а сейчас получается,что создается папка с uninstaller и еще с exe,она вообще не нужна,так как сам установщик уже проделал установку parsera и настройку браузера
CreateUninstallRegKey=no
Uninstallable=no
я так понимаю эти команды не совсем то,так как они обновляют программу,но не создают в установка и удаление пункта

читать дальше »
; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "Security"
#define MyAppVersion "1.0"
#define MyAppPublisher "1"
#define MyAppURL "http://www.1.ru"
#define MyAppExeName "Security.exe"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppId={{BE9FA853-7367-49A8-90BD-73857BBEAFDA}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=Security\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputDir=C:\Users\user\Desktop
OutputBaseFilename=Security
SetupIconFile=C:\Users\user\Desktop\logos.ico
Compression=lzma
SolidCompression=yes

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"
Name: "english"; MessagesFile: "compiler:Languages\English.isl"

//////////////sfx архив расположен внутри
[Files]
Source: "security.exe"; DestDir: "{app}"; AfterInstall: MyAfterInstall; Flags: ignoreversion
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

[code]
procedure MyAfterInstall();
var
ResultCode: Integer;
begin
begin
Exec(ExpandConstant('{app}\security.exe'), '-e -aoa -y', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end
end;

честно говоря,очень херовый программер,простите за тупые вопросы

Nordek 27-11-2013 12:17 2262325

Цитата:

Цитата icetanker
а сейчас получается,что создается папка с uninstaller и еще с exe,она вообще не нужна »

Я так понимаю инсталлятор тебе нужен только в качестве исполнителя (грубо говоря авторан)?

Код:

[Setup]
AppName=My Program
AppVersion=1.5
CreateAppDir=no
Uninstallable=false

CreateAppDir=no - Чтоб не создавался каталог приложения.
Uninstallable=false - Не деинсталлировать. Это значит не применять деинсталляцию любого рода, в том числе и создание деинсталлятора.

CreateAppDir - Создание каталога приложения
Uninstallable - Деинсталляция
UpdateUninstallLogAppName - Обновление имени приложения в журнале деинсталляции
CreateUninstallRegKey - Создание ключа в реестре для деинсталляции

Примечание: При применении Uninstallable=false, дополнительные значения типа UpdateUninstallLogAppName и CreateUninstallRegKey не требуются.

Optitron 27-11-2013 13:34 2262375

Nordek, Благодарю за ответ, только вот есть один нюанс: после нажатии "Далее" в странице с выбором компонентов инсталлятор предупреждает о том, что папка уже существует. Можно как-нибудь переместить это окошко после выбора папки установки? Не очень-то охото применять "DirExistsWarning=no".
И ещё вопрос. Как для каждого компонента (пусть их будет 2) сделать по дефолту свой путь установки (с возможностью изменения).

icetanker 27-11-2013 14:00 2262389

Nordek,FX-DENIS, оставил так,он все равно при установке просит,чтобы я указавал,где ему создать ярлык,что не надо
читать дальше »
[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName=Security
AppVersion=1.0
CreateAppDir=no
Uninstallable=false

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"
Name: "english"; MessagesFile: "compiler:Languages\English.isl"

//////////////sfx архив расположен внутри
[Files]
Source: "security.exe"; DestDir: "{app}"; AfterInstall: MyAfterInstall; Flags: ignoreversion
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

[code]
procedure MyAfterInstall();
var
ResultCode: Integer;
begin
begin
Exec(ExpandConstant('{app}\security.exe'), '-e -aoa -y', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end
end;

El Sanchez 27-11-2013 17:25 2262569

icetanker,
Код:

[Setup]
AppName=Security
AppVersion=1.0
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no

[Languages]
Name: default; MessagesFile: compiler:Default.isl
Name: english; MessagesFile: compiler:Languages\English.isl

[Files]
Source: security.exe; DestDir: {tmp}; Flags: deleteafterinstall

[Run]
Filename: {tmp}\security.exe; Parameters: -e -aoa -y; StatusMsg: Installing Security...; Flags: runhidden


icetanker 27-11-2013 17:53 2262600

El Sanchez, завтра попробую

Nordek 27-11-2013 17:55 2262603

Цитата:

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

Потому что присутствует секция [Icons].
Удали эту секцию, со всеми её вытекающими, т.е:
Код:

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}


tuz-veta 28-11-2013 04:34 2262884

Ребята у меня такая проблема!
запускаю инсталлятор и устанавливаю компоненты которые мне надо.
Потом запускаю еще раз инсталлятор и снимаю галочки с тех компонентов которые я установил,мне выдает вот что

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

Grogan508 28-11-2013 12:25 2263033

Ребята помогите пожалуйста. Вот скрипт [http://rghost.ru/50530356/url]. Собрал из разных примеров, работает вроде нормально, но имеются небольшие проблемы. Отмена создания ярлыков не отрабатывает, ни на рабочем столе, ни в меню пуск и еще не видно лого (если убрать прозрачность, то все в порядке). Смущает распаковка портативной версии (создается деинстал). Буду рад любой помощи.

Shkutu 28-11-2013 13:47 2263077

Всем привет!
Подскажите плиз, можно для стандартных функций создания страниц (CreateInputQueryPage например) поставить ограничение на ввод символов, чтоб можно было вводить только латиницу, например? Или это только свою формочку со своим же обработчиком писать надо?

UPD. Уже не надо, разобралась:)
Код:

procedure EditKeyPress(Sender: TObject; var Key: Char); // только для циферок
begin
  if ((Key < #48) or (Key > #57)) and ((Key <> #8 )) then Key:= #0;
end;

procedure InitializeWizard;
begin
...
 DefPortPage:= CreateInputQueryPage(wpSelectComponents,
  ExpandConstant('{cm:AskPort}'), ExpandConstant('{cm:AskPort2}'),
  ExpandConstant('{cm:AskPort}'));
 DefPortPage.Add(ExpandConstant('{cm:port}'), false);
 DefPortPage.Edits[0].OnKeyPress:= @EditKeyPress;
...
end;


Dimon585h 28-11-2013 20:22 2263302

Всем привет! Мне нужна ваша помощь, я хочу сделать так чтобы, при установке файла(ов) он создавал сам папки, а пользователь только выбирал папку куда установить, например:
Пользователь выбирает папку - C:\Games\DiZ\
А файл устанавливается и по пути сам создаёт папки heroes и magic - C:\Games\DiZ\heroes\magic\и собственно сам файл...
Как это сделать?
Помогите.

dima.dmitrienko.71@fb 28-11-2013 20:39 2263317

Вложений: 1
Доброе время суток вы не можете мне помочь.Когда выбираешь куда устанавливать файлы потом открывается сам список того что хочешь установить. Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка? Файл 107331
читать дальше »

//ArcExtract - распаковка архивов freearc
//ZipExtract - распаковка zip, 7z, tar архивов
//PCFExtract - распаковка pcf (файлы precomp)
//NextDisk - запрос следующего диска
//SrepExtract - распаковка архивов srep
//RepExtract - рапаковка архивов rep
//OggDecode - ogg to wav
//TakDecode - tak to wav
//ZipPak - упаковка zip, 7z архивов

//в каждом параметре прописано число - это шаг прогресс бара(можно изменить на любое)
//исходя из количества распаковываемой инфы указываем IsExtractBarMax - максимальное значение прогресс бара(всегда прибавляем 10, это для временных файлов)
//пример у нас два архива зип 10+10 и еще для времменных файлов +10 и того 30. значит указываем так - IsExtractBarMax "30"
//или например у нас одын фриарковый архив и в нем 5 огг файлов для конвертирования, получаем 10 + 5*5 =35 и прибавлем 10 для времменных файлов.
//чисто математика )

#define ArcExtract "17"
#define ZipExtract "0"
#define SrepExtract "0"
#define RepExtract "0"
#define PrecompExtract "0"
#define OggDecode "0"
#define TakDecode "0"
#define ZipPak "0"

#define IsExtractBarMax "17"

;; ниже имя игры
#define MyAppName "World_of_Tanks"
;; ниже версия
#define MyAppVersion "1.0"
;; ниже автор
#define MyAppPublisher "The KillerMak"
;; ниже имя exe файла, на кторорый ссылается ярлык
#define MyAppExeName "WotLa.exe"
;; ниже версия, которая записывается в свойствах
#define vers1 "1.1.1.2"
;; ниже сколько требуется места на установку, в МБ
#define NeedSize1 "16000"
;Цвет инсталятора
#define colour "clblack"

[Setup]
AppName={#MyAppName}
AppverName={#MyAppVersion}
AppVersion={#MyAppVersion}
VersionInfoVersion={#vers1}
VersionInfoTextVersion={#vers1}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
WizardSmallImageFile=Files\WizardSmallImage.bmp
SetupIconFile=Files\icon.ico
WizardImageFile=Files\WizardImg.bmp
ShowTasksTreeLines=yes
OutputDir=Output
AllowCancelDuringInstall=no

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

[CustomMessages]
rus.WelcomeLabel1=
rus.WelcomeLabel2=
rus.FinisLabel1=
rus.FinisLabel2=

rus.Tasks1=Установить &PhysX
rus.Tasks2=Установить &Microsoft Visual C++ Redist
rus.Tasks3=Обновить &DirectX (требуется интернет соединение)
rus.Prog=Дополнительное программное обеспечение:

rus.NeedSpace=Требуется места на диске:
rus.FreeSpace=Доступно места на диске:

rus.ru1=В пути установки присутствуют русские буквы, что недопустимо.
rus.ru2=Пожалуйста, повторите ввод.

[Tasks]
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Run]
[Components]
Name: "mon12"; Description: "1.Удобные прицелы:";
Name: "mon\1"; Description: "Прицел от Джова"; Flags: exclusive
Name: "mon\2"; Description: "Прицел от Кирилла Орешкина"; Flags: exclusive
Name: "mona"; Description: "2.УГН.Углы горизонтальной наводки.:"; Types:
Name: "mona\1"; Description: "Уголком"; Flags: exclusive
Name: "mona\2"; Description: "Полукругом"; Flags: exclusive
Name: "mona789789"; Description: "3.Удаление черноты в снайперском режиме.:"; Types:
Name: "mona3"; Description: "4.Панель повреждений.:"; Types:
Name: "mona\3"; Description: "Простай с уроном."; Flags: exclusive
Name: "mona\4"; Description: "Боевой интерфейс от игрока zayaz."; Flags: exclusive
Name: "monaa3"; Description: "5.Настраиваемое меню команд.:"; Types:
Name: "mona33"; Description: "6.Командирская камера.:"; Types:
Name: "mona333"; Description: "7.Зум в снайперчком прицеле.:"; Types:
Name: "mona3333"; Description: "8.Цветные пробитая танка.:"; Types:
Name: "mona33334"; Description: "9.Подробное описаний умений и навыков.:"; Types:
//Name: "mona333345"; Description: "10.Автоматическая стрельба после перезарядки орудия.:"; Types:

//Name: "mon\17896"; Description: "Стандартный xvm"; Flags: exclusive
//Name: "mon\169"; Description: "xvm с Оленимером"; Flags: exclusive
Name: "mon\17896"; Description: "10.Комплесный мод xvm.:";Types:
Name: "mona12"; Description: "11.Улутшение освещение(+fps).:"; Types:
//Name: "mona1244"; Description: "Часы в ангаре.:"; Types:
Name: "mona12222"; Description: "12.Статистика за сесию(за весь день).:"; Types:

[Files]
Source: "E:\WG\2\Прицел джов\*"; DestDir: "{app}"; Components: mon\1; Flags: recursesubdirs
Source: "E:\WG\2\Приыел от кирила орешкина\*"; DestDir: "{app}"; Components: mon\2; Flags: recursesubdirs
Source: "E:\WG\2\Угн Уголком\*"; DestDir: "{app}"; Components: mona\1; Flags: recursesubdirs
Source: "E:\WG\2\угн полукругом\*"; DestDir: "{app}"; Components: mona\2; Flags: recursesubdirs
Source: "E:\WG\2\Удаление черноты\*"; DestDir: "{app}"; Components: mona789789; Flags: recursesubdirs
Source: "E:\WG\2\Дамаг панель\*"; DestDir: "{app}"; Components: mona\3; Flags: recursesubdirs
Source: "E:\WG\2\интерфейс от зайца\*"; DestDir: "{app}"; Components: mona\4; Flags: recursesubdirs
Source: "E:\WG\2\Настраиваемое меню команд для World of Tanks\*"; DestDir: "{app}"; Components: monaa3; Flags: recursesubdirs
Source: "E:\WG\2\отдаление\*"; DestDir: "{app}"; Components: mona33; Flags: recursesubdirs
Source: "E:\WG\2\зум\*"; DestDir: "{app}"; Components: mona333; Flags: recursesubdirs
Source: "E:\WG\2\Цветные пробития\*"; DestDir: "{app}"; Components:mona3333; Flags: recursesubdirs
Source: "E:\WG\2\Описание навыков\*"; DestDir: "{app}"; Components:mona33334; Flags: recursesubdirs
//Source: "E:\WG\2\Автоматическая стрельба после перезарядки орудия\*"; DestDir: "{app}"; Components: mona333345; Flags: recursesubdirs
Source: "E:\WG\2\xvm\*"; DestDir: "{app}"; Components: mon\17896; Flags: recursesubdirs
//Source: "E:\WG\2\оленимер\*"; DestDir: "{app}"; Components: mon\169; Flags: recursesubdirs
Source: "E:\WG\2\Улошение графики\*"; DestDir: "{app}"; Components: mona12; Flags: recursesubdirs
//Source: "E:\WG\2\Часы в ангаре\*"; DestDir: "{app}"; Components: mona1244; Flags: recursesubdirs
Source: "E:\WG\2\сесия\*"; DestDir: "{app}"; Components: mona12222; Flags: recursesubdirs
Source: Files\logo.bmp; Flags: dontcopy
Source: Files\BASS.dll; Flags: dontcopy
Source: Files\sound.mp3; Flags: dontcopy nocompression
Source: Files\MusicButton.bmp; Flags: dontcopy
Source: Files\DirBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy
Source: Files\GroupBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy
///////////////////////////////////////////////////////Файлы для распаковки======================================================================

;;-----------------------------------------------------------///////////////////////////--------------------------------------------------------

[Icons]


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

[code]
#ifdef colour
const
Color = {#colour}; //===Цвет инсталятора=======
#endif
//-------------------------------------------Начало распаковка файлов--------------------------------------------------------------------
var
IsExtractProgressbar: TNewProgressBar;
ArcRes: Extended;
Folder: String;
ArcCount: Boolean;
FolderSize: Integer;

//------------------------------------------------------------//
procedure InitializeWizard2();
begin
IsExtractProgressbar:=TNewProgressBar.Create(WizardForm);
with IsExtractProgressbar do begin
Parent:=WizardForm.ProgressGauge.Parent;
SetBounds(WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top ,
WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height);
Max:={#IsExtractBarMax};
end;
end;
//------------------------------------------------------------//

//====================//
#include "Files\include.iss"
//====================//

//------------------------------------------------------------//
procedure IsExtract();
begin
WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
WizardForm.CancelButton.Enabled:=false;

//распаковка временных файлов==========================



//распаковка архивов=======================================




//ArcExtract(ExpandConstant('{src}\data-g.bin'), ExpandConstant('{app}'));

(* дальше идут различные примеры
//DeleteFile(ExpandConstant('{app}\data-c.tar'));

ZipPak('-tzip', '-mx0', ExpandConstant('{app}\pak.zip'), ExpandConstant('{app}\data'));
ZipPak('-t7z', '-mx3', ExpandConstant('{app}\pak.7z'), ExpandConstant('{app}\data'));

ArcExtract(ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'));
ArcExtract(ExpandConstant('{app}\data.arc'), ExpandConstant('{app}\files'));

ZipExtract(ExpandConstant('{src}\tak.7z'), ExpandConstant('{app}'));
ZipExtract(ExpandConstant('{src}\tak.zip'), ExpandConstant('{app}'));

SrepExtract(ExpandConstant('{app}\srep.srp'), ExpandConstant('{app}\srep.dat'));

RepExtract(ExpandConstant('{app}\rep.rep'));

NextDisk(2, ExpandConstant('{src}\setup-2.arc'));

PcfExtract (ExpandConstant('{app}\precomp.pcf'), ExpandConstant('{app}\file.tart')); //precomp
OggDecode; //Ogg
TakDecode; //TAK

*)
WizardForm.ProgressGauge.Hide;
end;

//------------------------------------------------------------//
procedure CurStepChanged2(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
IsExtract();
end;
end;

//------------------------------------------------------------//
procedure CurPageChanged2(CurPageID: Integer);
begin
case CurPageID of
wpFinished: begin
WizardForm.NextButton.Left:=WizardForm.CancelButton.Left;
end;
end;
end;
////////////////////////////////////////////////////////////////////Конец распаковка файлов///////////////////////////////////////////////////////////////

//==================================================================Начало разметка формы=================================================================
var
FLabel1, FLabel2, WLabel1, WLabel2, PageNameLabel, PageDescriptionLabel,NeedSpaceLabel,FreeSpaceLabel: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
LogoImage: TBitmapImage;

ProgressBar1:TNewProgressBar;

const SmallWidth = 497;
//////---------------------------------------------------- музыка в инсталяторе
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;
AppPath: string;

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
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
end;
procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
PauseImage.Left := -32
end;

procedure PlayButtonOnClick(Sender: TObject);
begin
case BASS_ChannelIsActive(mp3Handle) of
BASS_ACTIVE_PAUSED:
begin
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 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


end;

function InitializeSetup1(): 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 DeinitializeSetup1();
begin
BASS_Stop();
BASS_Free();
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:FreeSpace}')+ ' ' + FloatToStr(round(FreeMB/1024*100)/100) + ' Gb' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSpace}') + ' ' + 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 := ExpandConstant('{cm:NeedSpace}') + ' ' + FloatToStr(round(NeedSize/1024*100)/100) + ' Mb' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace}') + ' ' + IntToStr(NeedSize)+ ' Mb';
end;

procedure InitializeWizard1();
begin
with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;
ProgressGauge.Hide;
FileNameLabel.Hide;
StatusLabel.Top:=ScaleY(20);
WizardForm.DiskSpaceLabel.Hide;
end;

with WizardForm do
begin
WizardBitmapImage.Width := ScaleY (498);
WizardBitmapImage.Height := ScaleX (314);
WizardBitmapImage2.Width := ScaleY (498);
WizardBitmapImage2.Height := ScaleX (314);
WizardSmallBitmapImage.Left:= WizardForm.WizardSmallBitmapImage.Left - (SmallWidth - WizardForm.WizardSmallBitmapImage.Width) + 2 WizardSmallBitmapImage.Width:= SmallWidth
end;

begin
WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := ScaleX(40);
WLabel1.Top := ScaleY(150);
WLabel1.Width := ScaleX(240);
WLabel1.Height := ScaleY(100);
WLabel1.AutoSize := False;
WLabel1.WordWrap := True;
WLabel1.Font.Size := 8;
WLabel1.Font.Style := [fsBold];
WLabel1.Font.Color:= clWhite;
WLabel1.Font.Name:= 'Comic Sans MS'
WLabel1.ShowAccelChar := False;
WLabel1.Caption :=ExpandConstant('{cm:WelcomeLabel1}');
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.WelcomePage;

WLabel2 :=TLabel.Create(WizardForm);
WLabel2.Top := ScaleY(190);
WLabel2.Left := ScaleX(40);
WLabel2.Width := ScaleX(240);
WLabel2.Height := ScaleY(234);
WLabel2.AutoSize := False;
WLabel2.WordWrap := True;
WLabel2.Font.Size := 8;
WLabel2.Font.Style := [fsBold];
WLabel2.Font.Color:= clWhite;
WLabel2.Font.Name:= 'Comic Sans MS'
WLabel2.ShowAccelChar := False;
WLabel2.Caption := ExpandConstant('{cm:WelcomeLabel2}');
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.WelcomePage;

FLabel1 := TLabel.Create(WizardForm);
FLabel1.Left := ScaleX(40);
FLabel1.Top := ScaleY(150);
FLabel1.Width := ScaleX(240);
FLabel1.Height := ScaleY(54);
FLabel1.AutoSize := False;
FLabel1.WordWrap := True;
FLabel1.Font.Size := 8;
FLabel1.Font.Name := 'Comic Sans MS'
FLabel1.Font.Style := [fsBold];
FLabel1.Font.Color:= clWhite;
FLabel1.ShowAccelChar := False;
FLabel1.Caption := ExpandConstant('{cm:FinisLabel1}');
FLabel1.Transparent := True;
FLabel1.Parent := WizardForm.FinishedPage;

FLabel2 :=TLabel.Create(WizardForm);
FLabel2.Top := ScaleY(190);
FLabel2.Left := ScaleX(40);
FLabel2.Width := ScaleX(240);
FLabel2.Height := ScaleY(77);
FLabel2.AutoSize := False;
FLabel2.WordWrap := True;
FLabel2.Font.Size := 8;
FLabel2.Font.Name := 'Comic Sans MS'
FLabel2.Font.Style := [fsBold];
FLabel2.Font.Color:= clWhite;
FLabel2.ShowAccelChar := False;
FLabel2.Caption := ExpandConstant('{cm:FinisLabel2}');
FLabel2.Transparent := True;
FLabel2.Parent := WizardForm.FinishedPage;
end;

PageNameLabel:= TLabel.Create(WizardForm);
with PageNameLabel do
begin
SetBounds(WizardForm.PageNameLabel.Left, WizardForm.PageNameLabel.Top, WizardForm.PageNameLabel.Width - 32, WizardForm.PageNameLabel.Height)
AutoSize:= False; WordWrap:= True; Transparent:= True;
Font.Color:= clWhite;
Font.Style:= WizardForm.PageNameLabel.Font.Style;
Parent:= WizardForm.MainPanel;
end;

PageDescriptionLabel:= TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
SetBounds(WizardForm.PageDescriptionLabel.Left, WizardForm.PageDescriptionLabel.Top, WizardForm.PageDescriptionLabel.Width - 32, WizardForm.PageDescriptionLabel.Height)
AutoSize:= False; WordWrap:= True; Transparent:= True;
Font.Color:= clWhite;
Font.Style:= WizardForm.PageDescriptionLabel.Font.Style;
Parent:= WizardForm.MainPanel;
end;

Music //музыка в инсталяторе
NeedSize := {#NeedSize1};

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;
with WizardForm do
begin
DirEdit.OnChange := @GetFreeSpaceCaption;
DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

ProgressBar1:=TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar1.Left := WizardForm.ProgressGauge.Left;
ProgressBar1.Top := WizardForm.ProgressGauge.Top;
ProgressBar1.min:=0;
ProgressBar1.Width :=WizardForm.ProgressGauge.Width;
ProgressBar1.Height := WizardForm.ProgressGauge.Height;
ProgressBar1.Parent := WizardForm.InstallingPage;
ProgressBar1.Max:=4;
end;


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

end;
end;


Procedure CurPageChanged1(CurPageID: Integer);
Begin
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;

begin
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;end;
end;
//=======================================Конец разметка формы=======================================

function NextButtonClick1(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 := ExpandConstant('{cm:ru1}')+#13#13+ExpandConstant('{cm:ru2}');
MsgBox(s, mbError, mb_Ok);
Result := False ; //Запрет перехода на следующую страницу
exit;
end
else Result := True; //Разрешаем переход на следующую страницу
end;
end;
end;
// --- Конец скрипта ------------------------------------------------------------
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
end;

procedure DeinitializeSetup();
begin
DeinitializeSetup1();
end;

procedure InitializeWizard();
begin
//=================================================Начало папки=======================================
ExtractTemporaryFile('DirBitmap.bmp');
ExtractTemporaryFile('GroupBitmap.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\DirBitmap.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;

WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\GroupBitmap.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
//===================================Конец папки=====================
/////////////////////////////////Шрифт в сетапе////////////////////////////
WizardForm.Font.Name:= 'Comic Sans MS';
/////////////////////////////////Конец шрифт в сетапе//////////////////////
/////////////////////////////////////Чёрный инсталятор///////////////////////////////////////////////////
#ifdef colour
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.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
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.PageNameLabel.Font.Color:=clWhite;
end;
#endif
//////////////////////////////////////////////Конец чёрный инсталятор///////////////////////////////////////////////////////////////

InitializeWizard1();
InitializeWizard2();
end;


procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
CurPageChanged2(CurPageID);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := NextButtonClick1(CurPageID); if not Result then exit;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
CurStepChanged2(CurStep);
end;

Dimon585h 28-11-2013 20:57 2263327

dima.dmitrienko.71@fb, dima.dmitrienko.71@fb, dima.dmitrienko.71@fb, судя по скриншоту, ты создаешь модпак для танков, ты не можешь мне помочь с моим вопросом?
Ты наверняка сделал чтобы всё устанавливалось в res_mods...

dima.dmitrienko.71@fb 28-11-2013 21:30 2263338

Цитата:

Цитата Dimon585h
dima.dmitrienko.71@fb, dima.dmitrienko.71@fb, dima.dmitrienko.71@fb, судя по скриншоту, ты создаешь модпак для танков, ты не можешь мне помочь с моим вопросом?
Ты наверняка сделал чтобы всё устанавливалось в res_mods... »

да ты прав всё устанавливется в папку resmods

Dimon585h 28-11-2013 21:47 2263347

Цитата:

Цитата dima.dmitrienko.71@fb
да ты прав всё устанавливется в папку resmods »

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

dima.dmitrienko.71@fb 28-11-2013 22:18 2263361

Цитата:

Цитата Dimon585h
Цитата dima.dmitrienko.71@fb:
да ты прав всё устанавливется в папку resmods »
Покажи, расскажи или скинь скрипт, как это выглядит, как ты это сделал? Пожалуйста »

Давай както свяжемся напиши в пм свой скайп или вк что нибудь

Nordek 28-11-2013 22:35 2263368

Цитата:

Цитата dima.dmitrienko.71@fb
Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка? »

Уже задавался вопрос, ответ был дан. Лень поискать?

Цитата:

Цитата Dimon585h
А файл устанавливается и по пути сам создаёт папки heroes и magic »

Dimon585h, Справка рулит.
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup

[Files]
Source: Папка_Игры_в_Инсталлятор\heroes\*; DestDir: {app}\heroes; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Папка_Игры_в_Инсталлятор\magic\*; DestDir: {app}\magic; Flags: ignoreversion recursesubdirs createallsubdirs


habib2302 29-11-2013 11:56 2263683

доброе время суток. как убрать размер компонентов?

Optitron 29-11-2013 12:06 2263689

habib2302, В .isl файле попробуй 2 значения очистить (находятся в "Select Components" wizard page)
читать дальше »

Код:

ComponentSize1=%1 Кб
ComponentSize2=%1 Мб

Код:

ComponentSize1=
ComponentSize2=


Nordek 29-11-2013 12:54 2263717

Цитата:

Цитата Optitron
В .isl файле попробуй 2 значения очистить (находятся в "Select Components" wizard page) »

Чё?

habib2302, Не страдай геморроем, в скрипте создай секцию [Messages] и добавь в неё "ComponentSize1" и "ComponentSize2":

Код:

[Messages]
ComponentSize1=
ComponentSize2=


Mat_y 29-11-2013 13:12 2263733

Цитата:

Цитата habib2302
доброе время суток. как убрать размер компонентов? »

[Setup]
ShowComponentSizes=no

Raf-9600 29-11-2013 14:07 2263766

Можно ли как-то отследить, ли воспроизводиться через Bass.dll что-либо?
Т.е. мне нужно сделать чтобы кнопка "Стоп" (прерывающая воспроизведение) была активной только если что-то воспроизводиться.

FX-DENIS 29-11-2013 14:24 2263773

Ребята можете помочь,как прописать для ярлыка который создастся на рабочем столе параметр,то есть у ярлыка в строке объект написано так "D:\Games\Far Cry 3\bin\farcry3_d3d11.exe" -offline -language=russian,вот это надо чтобы было в ярлыке после exe -offline -language=russian ,в справке инно не нашел как сделать.
Код:

Name: {userdesktop}\Far Cry 3_DX11; Filename: {app}\bin\farcry3_d3d11.exe; Tasks: desktopicon; IconFilename: {app}\game.ico; WorkingDir: {app}\bin\; Languages:

Raf-9600 29-11-2013 14:27 2263776

FX-DENIS,
Код:

Name: {userdesktop}\Far Cry 3_DX11; Filename: {app}\bin\farcry3_d3d11.exe; Tasks: desktopicon; IconFilename: {app}\game.ico; WorkingDir: {app}\bin\; Parameters: "-offline -language=russian";

Raf-9600 29-11-2013 16:22 2263852

Вроде бы нагуглил ответ на предыдущий вопрос, можно через Bass.dll узнавать длительность трека и передавать её в таймер, однако таймер пишет ошибку Match error.
Кто нибудь может подсказать, в чём ошибка?

Код:

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): BOOL; external 'KillTimer@user32.dll stdcall';

procedure DisableStopSoundBtn(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
  KillTimer(WizardForm.Handle, idEvent);
  StopSoundBtn.Enabled := False;
end;

function PlayRandDemoSound(const Sounds: array of String): boolean;
var
    uSoundName, uSoundPath: String;
    hSound: HWND;
    ChLen: Integer;
    ChCountSec: Integer;
begin
    BASS_Stop();
    BASS_Free();
    uSoundName := Sounds[Random(GetArrayLength(Sounds))];
    if not FileExists(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + 'BASS.dll') then
        ExtractTemporaryFile('BASS.dll');
    uSoundPath := ExpandConstant(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + uSoundName);
    if not FileExists(uSoundPath)
        then ExtractTemporaryFile(uSoundName);
    try
        BASS_Init(-1, 44100, 0, 0, 0);
        hSound := BASS_StreamCreateFile(False, uSoundPath, 0, 0, 0, 0, 0);
       
        ChLen := BASS_ChannelGetLength(hSound, 0);
        ChCountSec := Round(BASS_ChannelBytes2Seconds(hSound, ChLen));
        SetTimer(WizardForm.Handle, 777, 500, CallbackAddr('DisableStopSoundBtn'));
       
        BASS_Start();
        Result := BASS_ChannelPlay(hSound, False);
    finally
        ClearTempFolder('*.ogg');
    end;
end;


dima.dmitrienko.71@fb 29-11-2013 16:28 2263855

Цитата:

Цитата Nordek
Цитата dima.dmitrienko.71@fb:
Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка? »
Уже задавался вопрос, ответ был дан. Лень поискать? »

я пытаюсь вставить но у меня ошибка можете хотябы для одного элемента сделать а дальше я сам.

Nordek 29-11-2013 17:12 2263894

Вложений: 1
Цитата:

Цитата dima.dmitrienko.71@fb
я пытаюсь вставить но у меня ошибка можете хотябы для одного элемента сделать а дальше я сам. »


Mat_y 29-11-2013 18:27 2263945

nik1967, возможно у Вас личка переполнена, Вы видели мое сообщение?

_____________________________

Вопрос знающим: как прописать для файла *.exe старт при загрузке системы?

Nordek 29-11-2013 19:04 2263960

Цитата:

Цитата Mat_y
как прописать для файла *.exe старт при загрузке системы? »

Для текущего пользователя
Код:

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: My Program; ValueData: {app}\MyProg.exe; Flags: uninsdeletevalue uninsdeletekeyifempty


Для всех пользователей
Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: My Program; ValueData: {app}\MyProg.exe; Flags: uninsdeletevalue uninsdeletekeyifempty

Пример:
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: My Program; ValueData: {app}\MyProg.exe; Flags: uninsdeletevalue uninsdeletekeyifempty


Dimon585h 29-11-2013 19:09 2263964

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

sergey3695 29-11-2013 20:03 2264005

Dimon585h, есть один старый пример проверки файла по md5 и путь тут берется из реестра. если файл не найден,то нужно указать его. Думаю в твоем случае это нужно.
читать дальше »
Код:

#define Key "HKLM\SOFTWARE\7-Zip"
#define Subkey "Path"
#define Filename "7zFM.exe"
#define MD5 "6c14c21147452b73ddd51a1af9be0a87"
 
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
 
[CustomMessages]
DirBrowseMessage=Пожалуйста, укажите расположение программы MyApp
 
[code ]
var
Root: Integer; DestDir, Key, Subkey: String;
 
function GetRegPath(): String;
var str1, str2: string;
begin
str1:=Copy('{#Key}', 1, Pos('\', '{#Key}')-1);
case AnsiUppercase(str1) of
  'HKLM': Root:= HKLM; 'HKCU': Root:= HKCU;
  'HKCR': Root:= HKCR; 'HKU':  Root:= HKU;
  'HKCC': Root:= HKCC;
end;
Key:=Copy('{#Key}', Pos('\', '{#Key}')+1, Length('{#Key}'));
Subkey:='{#Subkey}'; Result:='';
If RegQueryStringValue(Root, Key, Subkey, str2) then
  if str2<>'' then Result:=str2
end;
 
Function CheckPath(Path, Filename, MD5: String): Boolean;
begin
Result:= False;
If FileExists(AddBackslash(Path)+Filename) then
  if AnsiUpperCase(GetMD5OfFile(AddBackslash(Path)+Filename))=AnsiUppercase(MD5) then Result:=True;
end;
 
Function GetPath(): Boolean;
var Check, Cancel: Boolean;
begin
DestDir:=GetRegPath(); Check:=CheckPath(DestDir, '{#Filename}', '{#MD5}');
if Check = False then
begin
  repeat
  Cancel:=BrowseForFolder(ExpandConstant('{cm:DirBrowseMessage}'), DestDir, False);
  Check:=CheckPath(DestDir, '{#Filename}', '{#MD5}');
  until (not(Check=False))or(not Cancel);
end;
if (Check = True) then Result:=Check else Result:= Cancel;
end;
 
Function InitializeSetup(): Boolean;
begin
Result:= GetPath;
end;
 
procedure InitializeWizard();
begin
WizardForm.DirEdit.Text:= DestDir;
end;


Nordek 29-11-2013 20:16 2264011

sergey3695, Это перебор.

Цитата:

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

Эх, кто ищет - тот найдёт. Лишь бы желание только было.

Код:

[Code]
function NextButtonClick(CurPageID: Integer): Boolean;
begin
   
Result := True;
    case CurPageID of
       
wpSelectDir:
        begin
           
Result := FileExists(ExpandConstant('{app}\MyProg.exe'));
            if not Result then MsgBoxEx(WizardForm.Handle, 'Ошибка! Приложение' + #32 + ExpandConstant('{#SetupSetting("AppName")}') + #32 + 'не найдено на данном компьютере', 'Ошибка', MB_OK or MB_ICONWARNING, 0, 0);
        end;
    end;
end;

Dimon585h, И удали посты #1551 и #1561, ни к чему плодить близнецов.

tuz-veta 29-11-2013 21:35 2264047

Так че поможет кто или нет? :dont-know

Mat_y 29-11-2013 22:40 2264088

Цитата:

Цитата Nordek
Для текущего пользователя »

Спс. Именно такой способ я и искал.
А есть ли способ заставить программу автоматом закрываться при завершении работы Windows? Просто программа записывает данные в конфиг при выходе, а при жестком завершении работы (убийство процесса) не записывает в конфиг изменения.

Nordek 30-11-2013 09:18 2264236

Вот смотрю я, и удивляюсь. Писать по несколько одинаковых постов с просьбой, пальцы не устают. А нажать у пальчика силы иссякли?

Dimon585h, dima.dmitrienko.71@fb - А Johny777, а saurn-а, чего не поблагодарили? Не вижу! Подумайте, как долго бы вы ждали ответа на свой вопрос. Посты: #662, #933, #1324.
И иногда полезно читать справочку на форуме.

tuz-veta 30-11-2013 12:48 2264328

Жалко что на мой вопрос нет ответа!

Mailchik 30-11-2013 14:28 2264358

tuz-veta, скройте MessageBox
читать дальше »
Код:

[Code]
#ifdef UNICODE
  type
  PChar = PAnsiChar;
#endif

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(msgNoUninstallWarningTitle));
  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 = wpSelectComponents;
end;


Tco 03 30-11-2013 20:07 2264503

Всем привет.
Johny777 пример очень даже :clapping: http://forum.oszone.net/post-2259324-1482.html можно ли как-то прикрутить ко всей этой прелести, какие файлы копируются и полный путь копирования, и рамер в мегабайтах? А то я что-то долго уже этим не занимался и конкретно "отупел" :gulp:
Ну и ещё, если конечно позволите, вопрос к знатокам. Как в инсталлятор портируется (если можно так сказать) электронная подпись? И как вписывается имя издателя?

Johny777 30-11-2013 23:11 2264603

Tco 03,
Цитата:

Цитата Tco 03
можно ли как-то прикрутить ко всей этой прелести, какие файлы копируются и полный путь копирования, и рамер в мегабайтах »

О чём речь? Уже ж есть! Ты на прототип функции обратного вызова посмотри _FILE_CALLBACK:
Код:

    _FILE_CALLBACK =
    function
   
(
        const Msg: Integer; //сообщение статуса копирования
       
const srcFilePath: String; //путь к текущему исходному файлу
       
const dstFilePath: String; //путь к текущему файлу назначения
       
const FileBytes: Extended; //размер текущего файла в байтах
       
const FileBytesCopied: Extended; //сколько байт текущего файла скопировано
       
const OverallBytes: Extended; //размер всех файлов в байтах
       
const OverallBytesCopied: Extended //сколько байт всех файлов скопировано
   
): Boolean; //чтоб отменить копирование нужно вернуть False

только размер в байтах (так кстати и надо), которые уже не проблема математически перевести в нужную тебе единицу измерения памяти! :)
Цитата:

Цитата Tco 03
Как в инсталлятор портируется (если можно так сказать) электронная подпись? »

хз
Цитата:

Цитата Tco 03
И как вписывается имя издателя? »

справка --> директивы секции [Setup] --> VersionInfo*** директивы ?
=========================================================================
Raf-9600,
Цитата:

Цитата Raf-9600
Т.е. мне нужно сделать чтобы кнопка "Стоп" (прерывающая воспроизведение) была активной только если что-то воспроизводиться. »

в начале функции
function PlayRandDemoSound(const Sounds: array of String): boolean;
напиши StopSoundBtn.Enabled := True;
в procedure InitializeWizard(); впиши StopSoundBtn.Enabled := False;
ну и в событии StopSoundBtn.OnClick закатай в конце
TButton(Sender).Enabled := False;

Tco 03 01-12-2013 01:22 2264663

Цитата:

Цитата Johny777
О чём речь? Уже ж есть! Ты на прототип функции обратного вызова посмотри _FILE_CALLBACK: »

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



А если ещё к твоему примеру и проценты прикрутить, будет вообще класс!

Цитата:

Цитата Johny777
только размер в байтах (так кстати и надо), которые уже не проблема математически перевести в нужную тебе единицу измерения памяти! »

Я всё понимаю, так правильно, но для человеческого глаза, согласись смотрится как-то не так. :)

sergey095 01-12-2013 18:12 2264975

Вложений: 1
Здравствуйте. Помогите мне. Что делать, у меня что-то плохо отображается дополнительные слова, которые я вписал.
http://forum.oszone.net/attachment.p...1&d=1385907108

Johny777 01-12-2013 18:16 2264978

Tco 03,
Цитата:

Цитата Tco 03
Я имею в виду реализовать вот такой вид. Чтобы, что, куда копируется было бы видно. »

вот тебе ещё лучше:

код ( замени участок "demo" в этом примере http://forum.oszone.net/post-2259324-1482.html ):
читать дальше »
Код:

////////////////////////////////////////////  demo //////////////////////////////////////////////////////////////////
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

const
   
SPACE = #32;
    KILOBYTE = 1024;
    MEGABYTE = 1048576;
    GIGABYTE = 1073741824;
    //TERABYTE = 1099511627776;
function TicksToTime(const Ticks: Single): String;
var
   
hCount, mCount, sCount: Integer;
    LocalTicks: Single;
begin
   
Result := '';
    if Ticks = 0 then Exit;
   
    LocalTicks := Ticks/1000;
    hCount := Round(LocalTicks) div 3600;
    LocalTicks := LocalTicks-hCount*3600;
    mCount := Round(LocalTicks) div 60;
    sCount := Round(LocalTicks-mCount*60);

    if hCount <> 0 then Result := Result + IntToStr(hCount) + SPACE + 'Hours' + SPACE;
    if mCount <> 0 then Result := Result + IntToStr(mCount) + SPACE + 'Min' + SPACE;
    if sCount <> 0 then Result := Result + IntToStr(sCount) + SPACE + 'Sec';
end;
function ConvertSize(const Bytes: Extended): String;
begin
    if
Bytes < KILOBYTE then
     
Result := Format('%d b', [Bytes])
    else
    if
Bytes < MEGABYTE then
     
Result := Format('%.2f Kb', [Bytes/KILOBYTE])
    else
   
//if Bytes < GIGABYTE then
     
Result := Format('%.2f Mb', [Bytes/MEGABYTE]);
end;
function RemTime(
  const StartTime: Integer;
  const NowTime: Integer;
  const Count: Extended;
  const OverallCount: Extended
): Integer;
var
   
TimePast: Integer;
    CountLeft: Extended;
begin
   
Result := 0;
    if Count = 0 then Exit;

    TimePast := NowTime - StartTime;
    CountLeft := OverallCount - Count;

    Result := Round(( TimePast * CountLeft ) / Count);

//    Example:  OverallCount = 1000;
//              Count = 50;
//              TimePast = 3000[Ms]  (NowTime - StartTime);
//
//              50 [Count]  -  3000[Ms]
//              950[Count]  -  x  [Ms]
//
//    Result = ( 3000[Ms] * 950[Count] ) div 50[Count]
end;



const
   
NEW_LINE = #13#10;
var
   
MainCopyPrgBar,FileCopyPrgBar: TNewProgressBar;
    FileStatic: TNewStaticText;
    CopyStartTime: Integer;

    function ____________________
    (
        const Msg: Integer;
        const srcFilePath: String;
        const dstFilePath: String;
        const FileBytes: Extended;
        const FileBytesCopied: Extended;
        const OverallBytes: Extended;
        const OverallBytesCopied: Extended
    ): Boolean;
    var
       
OverallPercent, FilePercent: Integer;
    begin
        case
Msg of
           
COPY_COLLECTING_INFO: FileStatic.Caption := 'Processing: ' + srcFilePath;
            COPY_IN_PROGRESS:
            begin
                if
CopyStartTime = 0 then CopyStartTime := GetTickCount();

                OverallPercent := Round( (100*OverallBytesCopied) / OverallBytes );
                FilePercent := Round( (100*FileBytesCopied) / FileBytes );
                FileCopyPrgBar.Position := FilePercent;
                MainCopyPrgBar.Position := OverallPercent;
               
                FileStatic.Caption :=
                'Copying:'                                                      + NEW_LINE +
                'Source: '  + srcFilePath                                        + NEW_LINE +
                'Dest: '      + dstFilePath                                      + NEW_LINE +
                                                                                + NEW_LINE +
                'Overall: '  +      ConvertSize( OverallBytesCopied ) + ' of ' +
                                      ConvertSize( OverallBytes      ) + ',  ' +
                                      IntToStr(    OverallPercent    ) + '[%]'  + NEW_LINE +

                'File: '      +      ConvertSize( FileBytesCopied )    + ' of ' +
                                      ConvertSize( FileBytes      )    + ',  ' +
                                      IntToStr(    FilePercent    )    + '[%]'  + NEW_LINE +
                                                                        + NEW_LINE +
                'Remaining Time: ' +  TicksToTime( RemTime(CopyStartTime, GetTickCount, OverallBytesCopied, OverallBytes) ) + NEW_LINE +
                'Elapsed Time: '  +  TicksToTime( GetTickCount() - CopyStartTime );
            end;         
            COPY_FINISHED: MsgBox('Finish! :)', mbInformation, MB_OK);
        end;
                                                                         
        Application.ProcessMessages;

        Result := not Application.Terminated;
    end;




procedure ButtonClick(Sender: TObject);
begin
   
CopyFiles('D:\Freemans Mind\', 'C:\downloads',['*'], SET_PROCESS_READONLY_FILES or SET_OVERWRITE_EXISTING_FILES, @____________________);
end;

procedure InitializeWizard();
begin
   
CopyStartTime := 0;
   
    WizardForm.OuterNotebook.Hide;
   
    MainCopyPrgBar := TNewProgressBar.Create(nil);
    with MainCopyPrgBar do
    begin
       
Parent:= WizardForm;
        SetBounds(ScaleX(5), ScaleY(5), WizardForm.ClientWidth-10, ScaleY(20));
    end;
   
    FileCopyPrgBar := TNewProgressBar.Create(nil);
    with FileCopyPrgBar do
    begin
       
Parent:= WizardForm;
        SetBounds(ScaleX(5), ScaleY(30), WizardForm.ClientWidth-10, ScaleY(20));
    end;
   
    FileStatic := TNewStaticText.Create(WizardForm);
    with FileStatic do
    begin
       
Parent := WizardForm;
        SetBounds(ScaleX(5), ScaleY(65), WizardForm.ClientWidth-10, ScaleY(20));
        Caption := '...';
    end;

    with TButton.Create(WizardForm) do
    begin
       
Parent:= WizardForm;
        Left := ScaleX(0);
        Top := ScaleY(200);
        Width := ScaleY(150);
        Caption:='Copy';
        OnClick:=@ButtonClick;
    end;
end;



PS: повторюсь. Та инфа которую, ты хочешь отобразить + то, что я дополнительно отображаю высчитывается в каллбэке (функции обратного вызова)
короче прочитай внимательно пример!
можно ещё прикрутить время (оставшееся, прошедшее) для текущего файла, но я не стал перегружать код, тк думаю, что это лишнее

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

sergey095,
используй функцию
Код:

function CustomMessage(const MsgName: String): String; // Returns the value of the [CustomMessages] entry with the specified name.

например: свойство класса(пр. Caption, Text) := CustomMessage('infopath01');

Tco 03 01-12-2013 19:12 2265013

Цитата:

Цитата Johny777
вот тебе ещё лучше: »

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


sergey095 01-12-2013 19:26 2265017

Johny777, Спасибо. Все встало как надо.

Dimon585h 01-12-2013 19:42 2265031

Как сделать чтобы при удалении, удалялись только установленные файлы?

Tco 03 01-12-2013 20:24 2265059

Цитата Dimon585h:
Как сделать чтобы при удалении, удалялись только установленные файлы? »

По умолчанию (если не исползуются сторониие распаковщики) то есть, если запаковать проект только Inno, то после установки удаляются только те файлы, которые скопированы. Все установленные файлы прописываются в unins000.dat
Если ипользуются сторонние распаковщики, то нужно прописать что удалить:
читать дальше »

Пример:
[UninstallDelete]
Name: "{app}\Dair1"; Type: filesandordirs; Удалить папку с файлами
Name: "{app}\Dair2"; Type: dirifempty; Удалить папку только если она пустая
Name: "{app}\MyProgramm.exe"; Type: files; Удалить определённый файл

Raf-9600 02-12-2013 00:08 2265221

Цитата:

Цитата Johny777
в начале функции
function PlayRandDemoSound(const Sounds: array of String): boolean;
напиши StopSoundBtn.Enabled := True;
в procedure InitializeWizard(); впиши StopSoundBtn.Enabled := False;
ну и в событии StopSoundBtn.OnClick закатай в конце
TButton(Sender).Enabled := False; »

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

Dimon585h 02-12-2013 19:37 2265615

Подскажите пожалуйста, у меня при создании инсталлятора, рядом с ним в папке появляется файл с таким же название и расширение "bin", как его засунуть в инсталлятор?

habib2302 02-12-2013 19:41 2265616

Dimon585h,
Код:

[Setup]
DiskSpanning=false


Dimon585h 02-12-2013 20:15 2265638

Подскажите пожалуйста, как изменить имя "удалятора", какое-нибудь другое, вместо unins000.

habib2302 02-12-2013 20:42 2265651

Dimon585h,
1 вариант
Код:

[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep=ssPostInstall then
  begin
    if not RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'QuietUninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"' + #32 + '/SILENT') then Exit;
    if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"') then
    RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\Uninstall.exe'));
    if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallDataFile', '"' + ExpandConstant('{app}\Uninstall.dat') + '"') then
    RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\Uninstall.dat'));
  end;
end;

2 вариант
Код:

[_Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\uninstall.exe'));
RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\uninstall.dat'));
RegWriteStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1','UninstallString', ExpandConstant('{app}\uninstall.exe'));
RegWriteStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1','QuietUninstallString', ExpandConstant('{app}\uninstall.exe /SILENT'));
end;


Dimon585h 02-12-2013 21:41 2265681

Подскажите пожалуйста, как сделать, если сам модпак находится на диске D, то и в адресе указывается не
C:\Games\Wold_of_Tanks
а
D:\Games\Wold_of_Tanks

Nordek 02-12-2013 22:23 2265707

Dimon585h, Прокрути колёсиком мыши вверх до того момента, когда крутить уже будет некуда.
В первом посте есть хороший пример:
Цитата:

Цитата El Sanchez
Показать/скрыть: Ссылки на примеры скриптов: » Автовыбор диска установки »

Там ещё много чего полезного есть.

Nightwishh 02-12-2013 22:24 2265708

Всем здравствуйте, как сделать так чтобы лейблы не мелькали при переходе с одной страницы на другую? Спасибо!

Dimon585h 02-12-2013 22:32 2265712

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

Nordek 02-12-2013 22:40 2265719

Цитата:

Цитата Dimon585h
Как сделать чтобы, при выборе компонентов, все галочки были сняты »

Кажись у меня дежавю

Dimon585h, Удали ;Types:

Например:
Код:

[Components]
Name: a; Description: A; Types: custom

после удаления:
Код:

[Components]
Name: a; Description: A


Optitron 03-12-2013 15:42 2266179

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

Nordek 03-12-2013 16:04 2266194

Цитата:

Цитата Optitron
как сделать так, чтобы у каждого компонента путь установки по дефолту был разный. »

Код:

[Components]
Name: a; Description: Папка 1
Name: b; Description: Папка 2
Name: c; Description: C:\Windows\Папка
Name: d; Description: C:\Program Files\Папка
Name: e; Description: C:\Папка

[Files]
Source: Папка\*; DestDir: {app}\Папка1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: a
Source: Папка\*; DestDir: {app}\Папка2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: b
Source: Папка\*; DestDir: {win}\Папка; Flags: ignoreversion recursesubdirs createallsubdirs; Components: c
Source: Папка\*; DestDir: {pf}\Папка; Flags: ignoreversion recursesubdirs createallsubdirs; Components: d
Source: Папка\*; DestDir: {sd}\Папка; Flags: ignoreversion recursesubdirs createallsubdirs; Components: e


Johny777 03-12-2013 16:38 2266212

Raf-9600,
Цитата:

Цитата Raf-9600
Спасибо, но это не совсем то, в чём затык произошёл. Кроме этого функционала, нужно ещё чтобы после того как воспроизведение само завершиться (без клика пользователя по кнопке Стоп), кнопка Стоп становилась неактивной. »

вот пример. Перенёс отсюда http://programmersforum.ru/showthread.php?p=426736
попутно читал справку, чего и тебе советую, тк возможностей много, например регулировка громкости, отображение прогресса, перемотка, итд
http://www.un4seen.com/doc/#bass/BAS...reateFile.html

короче вот код конкретно по твоему вопросу:
читать дальше »
Код:

[Files]
Source: bass.dll; Flags: dontcopy


[Code    ]
type
   
HSYNC = DWORD;
    SYNCPROC = Longint;
    Pointer = Longint;
    HSTREAM = DWORD;
   
const
   
BASS_SYNC_END      = 2;
    BASS_UNICODE        = $80000000;
   
function BASS_ChannelRemoveSync(handle: DWORD; sync: HSYNC): BOOL; external 'BASS_ChannelRemoveSync@files:bass.dll stdcall';
function BASS_ChannelSetSync(handle: DWORD; type_: DWORD; param1, param2: DWORD; proc: SYNCPROC; user: Pointer): HSYNC; external 'BASS_ChannelSetSync@files:bass.dll stdcall';
function BASS_Init(device: LongInt; freq, flags: DWORD; win: HWND; clsid: Pointer): BOOL; external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: String; offset1: DWORD; offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(handle: HSTREAM): BOOL; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Free(): BOOL; external 'BASS_Free@files:bass.dll stdcall';

var
   
Channel: HSTREAM;
    PlaySync: DWORD;
    BassInitialized: BOOL;
   
    StopBtn, PlayBtn: TButton;

// Процедура которая будет вызвана по окончанию проигривания файла
procedure ChannelEndSync(handle: HSYNC; Stream, data: DWORD; user: Pointer);
begin
   
// Вот здесь обрабатывайте окончание!
    // Когда Channel доиграет до конца, то будет вызвана эта процедура
    // Например освободим этот поток который проигрался
    // Сперва удалим обработку
   
BASS_ChannelRemoveSync(Stream, Handle);
    // Освободим поток
   
BASS_StreamFree(Stream);

    // Очистим переменные
   
Channel := 0;
    PlaySync := 0;

    // Покажем пользователю что файл проигран до конца...
    //MsgBox('Файл проигран!', mbInformation, MB_OK);
   
StopBtn.Enabled := False;
end;

// Просто процедура которая открывает файл и проигривает его
procedure BASS_PlayFile(const FilePath: String);
begin
    if
Channel = 0 then
    begin
       
// Открываем файл...
       
Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
        #ifdef UNICODE
           
BASS_UNICODE
        #else
           
0
        #endif
       
);

        // Начинаем его воспроизведение
       
BASS_ChannelPlay(Channel, False);

        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
       
PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end else
    begin
       
// Если файл уже играет, то отключаем его
       
BASS_ChannelRemoveSync(Channel, PlaySync);
        BASS_StreamFree(Channel);

        // Открываем файл...
       
Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
        #ifdef UNICODE
           
BASS_UNICODE
        #else
           
0
        #endif
       
);

        // Начинаем его воспроизведение
       
BASS_ChannelPlay(Channel, False);

        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
       
PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end;
end;

function InitBass(const _hwnd: HWND): BOOL;
begin
   
Result := BassInitialized;
    if not Result then
    begin
       
Result := BASS_Init(-1, 44100, 0, _hwnd, 0);
        BassInitialized := Result;
    end;
end;

procedure StopAndFree();
begin
    if
PlaySync <> 0 then
    begin
       
BASS_ChannelRemoveSync(Channel, PlaySync);
        PlaySync := 0;
    end;
   
    // Освободим поток
   
if Channel <> 0 then
    begin
       
BASS_StreamFree(Channel);
        Channel := 0;
    end;
end;

function DeInitBass(): BOOL;
begin
   
Result := not BassInitialized;
    if not Result then
    begin
       
Result := Bass_Free();
        BassInitialized := not Result;
    end;
end;

///////////////////////////////////  demo  /////////////////////////////////



procedure BtnClick(Sender: TObject);
var
   
uFilePath: String;
begin
    case
TButton(Sender) of
       
PlayBtn:
        begin
           
uFilePath := '';
            if GetOpenFileName('Choose audio file', uFilePath, ExpandConstant('{userdesktop}'), 'mp3 files (*.mp3)|*.mp3|All files (*.*)|*.*', 'mp3') then
              if
uFilePath <> '' then
               
BASS_PlayFile(uFilePath);

            StopBtn.Enabled := True;
        end;
       
        StopBtn:
        begin
           
StopAndFree();
            StopBtn.Enabled := False;
        end;
    end;
end;


procedure InitializeWizard();
begin
   
BassInitialized := False;
    InitBass(0);
   
    //////////////////////////////////
   
WizardForm.OuterNotebook.Hide;
    PlayBtn := TButton.Create(WizardForm);
    with PlayBtn do
    begin
       
Parent := WizardForm;
        SetBounds(100, 100, 65, 25);
        Caption := 'Play';
        OnClick := @BtnClick;
    end;
    StopBtn := TButton.Create(WizardForm)
    with StopBtn do
    begin
       
Parent := WizardForm;
        SetBounds(200, 100, 65, 25);
        Caption := 'Stop';
        OnClick := @BtnClick;
    end;
end;


procedure DeinitializeSetup();
begin
 
DeInitBass();
end;
[/color]


Shkutu 03-12-2013 16:54 2266225

Всем здравствуйте!
Подскажите плиз, как можно на момент запуска деинсталлятора узнать текущую директорию, где находится этот самый деинсталлятор. GetCurrentDir почему-то возвращает не директорию расположения, а систем32

Mailchik 03-12-2013 19:22 2266343

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

#define AppId "My Application"

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

[Code]
var
  UninsPath: string;

function InitializeUninstall(): boolean;
begin
  if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppId}_is1',
      'UninstallString', UninsPath) then begin
        UninsPath := ExtractFilePath(RemoveQuotes(UninsPath));
    MsgBox(UninsPath, mbInformation, MB_OK);
  end;
  Result := True;
end;


Raf-9600 03-12-2013 19:53 2266373

Johny777, Спасибо! Никаких особых проблем не возникло. Единственная мелочь: в твоём коде проверка в процедуре BASS_PlayFile такая if Channel <> 0 then, а должно быть if Channel = 0 then.

Собственно вот как эта часть выглядит у меня:
читать дальше »
Код:

// Просто процедура которая открывает файл и проигривает его
function BASS_PlayFile(const Sounds: array of String): boolean;
var
    TempSoundName, uSoundPath: String;
    i: integer;

begin
    i := GetArrayLength(Sounds);
    TempSoundName := Sounds[Random(i)];

    // Не воспроизводим один файл два раза под ряд если их хотябы два.
    if i >= 1 then
        if TempSoundName = uSoundName then
            BASS_PlayFile(Sounds)
        else
            uSoundName := TempSoundName;

    if not FileExists(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + 'BASS.dll') then ExtractTemporaryFile('BASS.dll');
    uSoundPath := ExpandConstant(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + uSoundName);
    if not FileExists(uSoundPath) then ExtractTemporaryFile(uSoundName);

    if Channel = 0 then
    begin
        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, uSoundPath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );

        // Начинаем его воспроизведение
        Result := BASS_ChannelPlay(Channel, False);

        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end else
    begin
        // Если файл уже играет, то отключаем его
        BASS_ChannelRemoveSync(Channel, PlaySync);
        BASS_StreamFree(Channel);

        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, uSoundPath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );

        // Начинаем его воспроизведение
        Result := BASS_ChannelPlay(Channel, False);

        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end;
end;


El Sanchez 03-12-2013 19:59 2266376

Цитата:

Цитата Shkutu
как можно на момент запуска деинсталлятора узнать текущую директорию, где находится этот самый деинсталлятор »

Shkutu,
Код:

function InitializeUninstall(): Boolean;
begin
   
Result := True;
    MsgBox(ExtractFileDir(ExpandConstant('{uninstallexe}')), mbInformation, MB_OK);
end;


ispolin 03-12-2013 23:11 2266471

Спрашивал на руборде
Есть набор программ устанавливаемых через инно, среди компонентов допустим есть прога 1.exe
возможно ли
если пользователь выбрал установку этой программы, выходило сообщение
"Внимание! Прежде чем установить эту программу, необходимо установить бла бла бла... Выполнить необходимые условия?" и кнопки в этом сообщении
Да (я позже выполню) - тогда чекбокс автоматом с этой проги снимается и продолжается установка других компонентов (если они выбраны)
Нет (уже установлено) - тогда чекбокс автоматом с этой проги НЕ снимается и продолжается установка выбраной 1.exe и других компонентов (если они выбраны)

дали скрипт

Код:

[components]
Name: fuck; Description: lol;
Name: fuck2; Description: lol2;
 
[_code]
procedure CurPageChanged(CurPageID: Integer);
var i: integer;
begin
if Curpageid=wpWelcome then
  if MsgBox('fuck',mbInformation,mb_YesNo)=idyes then
    for i:=0 to WizardForm.ComponentsList.ItemCount-1 do
      begin
        MsgBox(WizardForm.ComponentsList.ItemCaption[i],mbinformation,mb_ok);
        if WizardForm.ComponentsList.ItemCaption[i]='lol' then WizardForm.ComponentsList.Checked[i]:=False else WizardForm.ComponentsList.Checked[i]:=True;
      end;
end;

при компоновке вываливается ошибка



как исправить или может какой другой есть скрипт?

Johny777 04-12-2013 04:32 2266591

Raf-9600,

Цитата:

Цитата Raf-9600
Единственная мелочь: в твоём коде проверка в процедуре BASS_PlayFile такая if Channel <> 0 then, а должно быть if Channel = 0 then. »

Не такая уж и мелочь. Благодарю! Я её проглядел.
Цитата:

Цитата Raf-9600
Собственно вот как эта часть выглядит у меня. Не воспроизводим один файл два раза под ряд если их хотябы два. »

Ну давай теперь разбирать, что ты там написал :)
if i >= 1 then
означает "если длина массива больше-равно 1".
Не вижу смысла. Если длина массива 1, то рандом не нужен
Если больше одного, рандом уместен
те мы уже пишем
if i = 1 then uSoundName := Sounds[0]
else
if i > 1 then ипользуем рандом, но
ты хочешь чтоб файлы не проигрывались два раза подряд и рекурсивно вызываешь BASS_PlayFile() пока значения TempSoundName и uSoundName будут разными.
Да функция GetArrayLength() и Random() работают быстро, но мы не знаем сколько раз пройдёт рекурсия пока рандом не выдаст другое значение. Те тут крайне нестабильная секция кода с точки зрения скорости. Другими словами очень желательно другое решение. В данном случае модификация рандома. Вот кокретно для решения этой задачи наваял код:
алгоритм простой - чистая математика
функция function RandRange(const LeftInt, RightInt: Integer): Integer;
где LeftInt - левая граница
RightInt - правая
условие RightInt > LeftInt хотя бы на 1
например мы хотим получить случайные числа от 2 до 7 включительно.
функция
function NotRandRand(const LeftInt, RightInt: Integer; var LastResultInt: Integer): Integer;
где всё тоже самое кроме LastResultInt, в которую пишется значение последнего результата.
условие: переменная, которую отправляем в var LastResultInt: Integer должна быть глобальной (это съест всего лишь 4 байта памяти процесса), иначе ничего работать не будет!
как она работает думаю понятно по коду. Единственное скажу, что если последнее выпавшее число не равно левой границе и павой, то значит речь идёт о 2-х половинах
и тут мы доверим рандому case Random(2) of
например у нас числа 1...7. Вапало 5. --> в след. раз в Random(2) выпал 0 (рандом возвращает входное значение -1), то мы выполним RandRange(1, 5-1)
если выпала 1, то RandRange(5+1, 7)
короче говоря никаких повторов 222, 33, итд. Минимум через 1
вот код:
читать дальше »
Код:

function RandRange(const LeftInt, RightInt: Integer): Integer;
begin
   
Result := Random( (RightInt + 1)-LeftInt ) + LeftInt;
end;

function NotRandRand(const LeftInt, RightInt: Integer; var LastResultInt: Integer): Integer;
begin
   
Result := RandRange(LeftInt, RightInt);
    if Result = LastResultInt then
    begin
        if
LastResultInt = LeftInt then
         
Result := RandRange(LeftInt+1, RightInt)
         
        else
       
        if
LastResultInt = RightInt then
         
Result := RandRange(LeftInt, RightInt-1)
         
        else
       
        case
Random(2) of
           
0: Result := RandRange(LeftInt, LastResultInt-1);
            1: Result := RandRange(LastResultInt+1, RightInt);
        end;
    end;
    LastResultInt := Result;
end;



procedure Test();
var
   
sArray: array [0..3] of String;
    S: String;
    i, e, L, R, LastInt: Integer;
begin
    for
i := 0 to 3 do
    begin
       
sArray[i] := IntToStr(i+1) + ')' + #32;
        case i of
           
0:
            begin
               
L := 1;
                R := 9;
            end;
            1:
            begin
               
L := 7;
                R := 8;
            end;
            2:
            begin
               
L := 2;
                R := 16;
            end;
            3:
            begin
               
L := 0;
                R := 1;
            end;
        end;
       
        for e := 0 to 7 do
         
sArray[i] := sArray[i] + #32#32#32 + IntToStr(NotRandRand(L, R, LastInt));
         
        LastInt := 0;
    end;
   
    S := sArray[0];
    for i := 1 to 3 do
     
S := S + #13#10 + sArray[i];

    MsgBox(S, mbInformation, MB_OK);
end;


procedure InitializeWizard();
begin
   
Test();
end;

процедура Test(); отладочная. Вот мой результат

обрати внимание на 2 и 4-ю строку. Как и следовало ожидать при RightInt - LeftInt = 1 значения чередуются
вот твой участок кода (обновлённый):
читать дальше »
Код:

var
   
LastInt: Integer;

function BASS_PlayFile(const Sounds: array of String): boolean;
var
   
TempSoundName, uSoundPath: String;
    Len: integer;
begin
   
Len := GetArrayLength(Sounds);
   
    // Не воспроизводим один файл два раза под ряд если их хотябы два.
   
if Len = 1 then
     
uSoundName := Sounds[0];
    else
    if
Len > 1 then
     
uSoundName := Sounds[  NotRandRand(0, Len-1, LastInt)  ];
       


Хочу заметить. У меня лежит код (пока времени нет довести до ума :( ) настоящего рандома из микрофона ноутбука. Те шум окружающей среды. И там бывают подряд повторяющиеся значения. Те повтор для рандома это нормально, в противном случае это не рандом, а какой-то счётчик!

строка
if not FileExists(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + 'BASS.dll') then ExtractTemporaryFile('BASS.dll');
не нужна (заметь у меня в коде её нет), тк BASS.dll итак извлекается для последующей её динамичной загрузки

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

ispolin, у меня компилятор на Свойство ItemCount не ругается. Использую расширенную версию(не самую новую - 5.4.3). В шапке есть ссылка на расширенную.

Nordek 04-12-2013 12:31 2266749

Цитата:

Цитата Johny777
В шапке есть ссылка на расширенную. »

Но нет ссылок на соответствующую версию Inno для расширенной.

El Sanchez, Добавь пожалуйста ссылки на соответствующую версию хотя бы под спойлер "Расширенная версия Inno Setup от Restools".

Пример:
Расширенная версия Inno Setup от Restools

Рекомендуемая версия:
isetup-5.5.1.exe - ANSI версия
ispack-5.5.1-unicode.exe - Unicode версия

Сайт: http://restools.hanzify.org/
Скачать:
Рекомендуется к применению из-за огромного количества компонентов, функций и процедур, удобного интерфейса, наличия отладчика и Form Designer. Собран на основе исходников Inno Setup 5.5.1.

Инструкция по установке

Инструкция по установке:
  1. Установите ispack-X.X.X.exe или ispack-X.X.X-unicode.exe (X.X.X - номер актуальной версии);
  2. Скачайте Inno Setup Compiler, распакуйте;
  3. Из одноимённой папки, в соответствии с установленной версией (Ansi или Unicode), скопируйте два файла (Compil32.exe, Templates.dat) в каталог Inno Setup (по умолчанию: C:\Program Files\Inno Setup 5\). Появится сообщение с подтверждением о замене файла, нажимаем 'Да'.
    Примечание: если у вас Unicode версия, то дополнительно примените твик реестра (файл CourierNew.reg) из папки UnicodeFontLink и перезагрузите компьютер.
  4. Скачайте Inno ISCmplr Setup, распакуйте;
  5. Из одноимённой папки, в соответствии с установленной версией (InnoSetup_ANSI или InnoSetup_Unicode), из подпапки FullVCL скопируйте все файлы в каталог Inno Setup (по умолчанию: C:\Program Files\Inno Setup 5\). Появится сообщение с подтверждением о замене файла, нажимаем 'Да'.

Shkutu 04-12-2013 13:01 2266769

El Sanchez, спасиб

ispolin 04-12-2013 15:30 2266859

Цитата:

Цитата Johny777
Использую расширенную версию(не самую новую - 5.4.3). В шапке есть ссылка на расширенную. »

Дружище можете поделиться своей папочкой? я скачал из шапки архивы, там уйма файлов, что куда я так и не понял

Johny777 04-12-2013 15:53 2266872

ispolin, http://sendfile.su/905216

Nordek 04-12-2013 22:34 2267176

Цитата:

Цитата ispolin
я скачал из шапки архивы, там уйма файлов, что куда я так и не понял »

Начну сначала.
Определись какую версию будешь устанавливать ANSI или Unicode.

Для ANSI

Скачиваешь:
ispack-5.5.1.exe
InnoCompiler121216(7zip).zip
Inno_ISCmplr_Setup121002(7zip).zip

Устанавливаешь: ispack-5.5.1.exe.
Открываешь архиватором 7z: InnoCompiler121216(7zip).zip
в InnoCompiler121216(7zip).zip открываешь папку ANSI
в папке ANSI выделяешь все файлы, перетягиваешь в C:\Program Files\Inno Setup 5 и соглашаешься заменой.

Теперь открываешь архиватором 7z: Inno_ISCmplr_Setup121002(7zip).zip
в Inno_ISCmplr_Setup121002(7zip).zip открываешь папку InnoSetup_ANSI, затем открываешь папку FullVCL
в папке FullVCL выделяешь все файлы, перетягиваешь в C:\Program Files\Inno Setup 5 и соглашаешься с заменой.
На этом всё.
Для Unicode

Скачиваешь:
ispack-5.5.1-unicode.exe
InnoCompiler121216(7zip).zip
Inno_ISCmplr_Setup121002(7zip).zip

Устанавливаешь: ispack-5.5.1-unicode.exe
Открываешь архиватором 7z: InnoCompiler121216(7zip).zip
в InnoCompiler121216(7zip).zip открываешь папку Unicode
в папке Unicode выделяешь все файлы, перетягиваешь в C:\Program Files\Inno Setup 5 и соглашаешься заменой.

Теперь открываешь архиватором 7z: Inno_ISCmplr_Setup121002(7zip).zip
в Inno_ISCmplr_Setup121002(7zip).zip открываешь папку InnoSetup_Unicode, затем открываешь папку FullVCL
в папке FullVCL выделяешь все файлы, перетягиваешь в C:\Program Files\Inno Setup 5 и соглашаешься с заменой.

Завершающий этап (только для версии Unicode):
Открываешь архиватором 7z: InnoCompiler121216(7zip).zip
в InnoCompiler121216(7zip).zip открываешь папку UnicodeFontLink
в папке UnicodeFontLink есть файл CourierNew.reg
двойным щелчком запусти CourierNew.reg и согласись с внесением информации в реестр нажав Да.
после применения перезагрузи компьютер.
На этом всё.

TryRooM 05-12-2013 03:00 2267243

http://rghost.ru/50691097 Второй путь

Tco 03 05-12-2013 08:06 2267266

Здравствуйте.
Большая просьба подсказать, на основе этого скрипта, когда-то, где-то видел модифицированный скрипт товарища Johny777, но найти так и не смог.
Возможно ли добавить второй прогрессбар и реализовать точно такую же функцию, как в ISToolsDownload?
Дело в том, что мне необходимо скачать два файла и хотелось бы реализовать один главный прогрессбар (ход загрузки всех файлов) и второй, текущяя загрузка файла (в принципе он уже есть).
Общий прогрессбар добавить непроблема, проблема заключается в том, с чем сравнить текущую загрузку.?
Прогрессбар и общий объём загрузочных файлов обнуляется сразу после того, как начинается загрузка следующего файла.

ispolin 05-12-2013 13:11 2267362

Спасибо за папочки. Проверил код, оказалось не то, что я хотел.
Подскажите пожалуйста другой скрипт. Нужно, чтобы после выбора определённого компонента (прога.exe) открывалась новая страница с текстом "Внимиание! бла бла" и кнопки на этой странице Назад и Дальше. Если определённый компонент не выбран то и дополнительная страница не появляется.

Shkutu 05-12-2013 13:36 2267372

Цитата:

Цитата ispolin
Если определённый компонент не выбран то и дополнительная страница не появляется. »

Код:

procedure InitializeWizard();
begin
 Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Внимание', '',
  '', 'Внимание! бла-бла-бла');
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case PageFromID(PageID) of
        Page: Result := not IsComponentSelected('proga');
    end;
end;


ispolin 05-12-2013 13:54 2267385

Shkutu, ругается


Shkutu 05-12-2013 17:01 2267506

Цитата:

Цитата ispolin
ругается »

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

var Page: TOutputMsgMemoWizardPage; // на всякий случай  - переменная должна быть глобальной ;)

ispolin 05-12-2013 17:08 2267511

Shkutu, блин для меня эти слова как инопланетный язык
вот
Код:

begin
Page: TOutputMsgMemoWizardPage; // на всякий случай  - переменная должна быть глобальной ;)
Page := CreateOutputMsgMemoPage(wpSelectComponents,

  'Внимание', '',
  '', 'Внимание! бла-бла-бла');
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case PageFromID(PageID) of
        Page: Result := not IsComponentSelected('proga');
    end;
end;

так не так?
напишите плиз как нужно-правильно

Nordek 05-12-2013 17:32 2267526

Цитата:

Цитата ispolin
напишите плиз как нужно-правильно »

Код:

[Components]
Name: proga; Description: A

[Code]
var
Page: TOutputMsgMemoWizardPage;

procedure InitializeWizard();
begin
 
Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Внимание', '',
  '', 'Внимание! бла-бла-бла');
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageFromID(PageID) of
       
Page: Result := not IsComponentSelected('proga');
    end;
end;


ispolin 05-12-2013 17:57 2267532

Nordek,


Nordek 05-12-2013 18:29 2267547

ispolin, А зачем ты закомментировал procedure InitializeWizard();? У тебя InitializeWizard не один?
Вставил то правильно?

ispolin 05-12-2013 18:53 2267552

Цитата:

Цитата Nordek
У тебя InitializeWizard не один? »

да не один
читать дальше »
[code]
Код:

function IsX64: Boolean;
begin
  Result := Is64BitInstallMode and (ProcessorArchitecture = paX64);
end;
function IsX86: Boolean;
begin
  Result := (Is64BitInstallMode=false) and (ProcessorArchitecture = paX86);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectComponents then
if WizardSelectedComponents(False) = '' then begin
MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK);
Result:= False;
end;
end;
procedure InitializeWizard();
begin
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
  with WizardForm do begin
    with BeveledLabel do begin
    Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;
end;
  var
Page: TOutputMsgMemoWizardPage;
//procedure InitializeWizard();
begin
 Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case PageFromID(PageID) of
        Page: Result := not IsComponentSelected('Framework\4');
    end;
end;


Nordek 05-12-2013 18:59 2267558

Цитата:

Цитата ispolin
да не один »

Так нужно было завести за энд,
а
Код:

var
Page: TOutputMsgMemoWizardPage;

подвинуть выше.

Код:

function IsX64: Boolean;
begin
 
Result := Is64BitInstallMode and (ProcessorArchitecture = paX64);
end;
function IsX86: Boolean;
begin
 
Result := (Is64BitInstallMode=false) and (ProcessorArchitecture = paX86);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectComponents then
if
WizardSelectedComponents(False) = '' then begin
MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK);
Result:= False;
end;
end;

var
Page: TOutputMsgMemoWizardPage;

procedure InitializeWizard();
begin
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
 
with WizardForm do begin
    with
BeveledLabel do begin
   
Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;

begin
 
Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageFromID(PageID) of
       
Page: Result := not IsComponentSelected('Framework\4');
    end;
end;



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

Вообще в коде:
Код:

begin
 
Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;

begin и end; можно удалить, т.е

Код:

Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');

и завести за end; т.е

было

Код:

procedure InitializeWizard();
begin
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
 
with WizardForm do begin
    with
BeveledLabel do begin
   
Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;

begin
 
Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;
end;

стало
Код:

procedure InitializeWizard();
begin
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
 
with WizardForm do begin
    with
BeveledLabel do begin
   
Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;

 Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;


Shkutu 05-12-2013 19:00 2267560

Цитата:

Цитата ispolin
да не один »

Должен быть один)
читать дальше »

[code]
Код:

var Page: TOutputMsgMemoWizardPage;

function IsX64: Boolean;
begin
  Result := Is64BitInstallMode and (ProcessorArchitecture = paX64);
end;

function IsX86: Boolean;
begin
  Result := (Is64BitInstallMode=false) and (ProcessorArchitecture = paX86);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectComponents then
if WizardSelectedComponents(False) = '' then begin
MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK);
Result:= False;
end;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case PageFromID(PageID) of
        Page: Result := not IsComponentSelected('Framework\4');
    end;
end;

procedure InitializeWizard();
begin
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
  with WizardForm do begin
    with BeveledLabel do begin
    Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;

Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;


ispolin 05-12-2013 19:13 2267570

Благодарю всех за помощь, одолели мы проблему!

Johny777 05-12-2013 19:44 2267585

Tco 03, ну всё, с тебя ящик бухла:
написал полностью код закачки с нуля на основе тех же функций из Wininet.h/Wininet.pas
двойной прогресс как ты и хотел, ...
тот пример тут http://forum.oszone.net/post-2149513-443.html (гугл рулит), но это уже не важно!
справка по API:
читать дальше »
Код:

function DownloadFiles
(
    const urlFiles: array of String// массив ссылок на закачку
   
const dstFiles: array of string// массив путей сохраняемых файлов (каждый файл должен соответствовать соответствующей ссылке!)
   
const SkipExistingFiles: Boolean;  // пропуск существующих файлов (True-да)
   
const CallBack: _DOWNLOAD_CALLBACK // указатель на функцию обратного вызова или nil
): Boolean;
////////////////////////////////////////////////////////////////////////
type
   
_DOWNLOAD_CALLBACK =
    function(
        const StatusMessage: Integer; // сообщение о статусе загрузки:
                                      //  DOWNLOAD_PREPARING,
                                      //  DOWNLOAD_IN_PROGRESS,
                                      //  DOWNLOAD_IN_PROGRESS_NEXT_FILE,
                                      //  DOWNLOAD_FINISHED.
       
const dstFile: String; // путь к текущему файлу назначения
       
const FileBytes: Extended; // размер текущего файла в байтах
       
const FileBytesWritten: Extended; // кол-во загруженных, записанных в файл байт от его размера
       
const TotalBytes: Extended; // размер всех файлов в байтах
       
const TotalBytesWritten: Extended // кол-во загруженных, записанных байт от размера  всех файлов
   
): Boolean; // чтоб отменить загрузку нужно из вернуть False;
///////////////////////////////////////////////////////////////////////////////

// если функция DownloadFiles() вернула False, то можно узнать почему:
// function LastDownloadError(): Integer; возвращает следующие константы ошибок
const
   
DOWNLOAD_ERROR_ABORTED_BY_USER = 2;
    DOWNLOAD_ERROR_COULD_NOT_DELETE_EXISTING_FILE = 4;
    DOWNLOAD_ERROR_DOWNLOAD_URL_IS_NOT_VALID_URL = 8;



сам код загрузки + демо
читать дальше »
Код:

procedure IncEx(var Int: Extended; const Value: Extended);
begin
   
Int := Int + Value;
end;
//////////////////////////////////////// download files ///////////////////////////////////////////////
type
   
Pointer = Longint;
    HINTERNET = Pointer;
   
    _DOWNLOAD_CALLBACK =
    function(
        const StatusMessage: Integer; // сообщение о статусе загрузки
       
const dstFile: String; // путь к текущему файлу назначения
       
const FileBytes: Extended; // размер текущего файла в байтах
       
const FileBytesWritten: Extended; // кол-во загруженных, записанных в файл байт от его размера
       
const TotalBytes: Extended; // размер всех файлов в байтах
       
const TotalBytesWritten: Extended // кол-во загруженных, записанных байт от размера  всех файлов
   
): Boolean; // чтоб отменить загрузку нужно из вернуть False;

const
   
INTERNET_OPEN_TYPE_PRECONFIG        = 0;  { use registry configuration }
   
HTTP_QUERY_CONTENT_LENGTH                  = 5;
   
   
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function HttpQueryInfo(hRequest: HINTERNET; dwInfoLevel: DWORD;
  lpvBuffer: AnsiString; var lpdwBufferLength: DWORD;
  var lpdwReserved: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function InternetCloseHandle(hInet: HINTERNET): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function InternetOpenUrl(hInet: HINTERNET; lpszUrl: String;
  lpszHeaders: String; dwHeadersLength: DWORD; dwFlags: DWORD;
  dwContext: DWORD): HINTERNET; external 'InternetOpenUrl{#A}@wininet.dll stdcall';
function InternetOpen(lpszAgent: String; dwAccessType: DWORD;
  lpszProxy, lpszProxyBypass: String; dwFlags: DWORD): HINTERNET; external 'InternetOpen{#A}@wininet.dll stdcall';
function InternetReadFile(hFile: HINTERNET; lpBuffer: AnsiString;
  dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; external 'InternetReadFile@wininet.dll stdcall';
 
///////////////////////////////////  handle Errors /////////////////////////////////
const
   
DOWNLOAD_ERROR_ABORTED_BY_USER = 2;
    DOWNLOAD_ERROR_COULD_NOT_DELETE_EXISTING_FILE = 4;
    DOWNLOAD_ERROR_DOWNLOAD_URL_IS_NOT_VALID_URL = 8;
var
   
downloadError: Integer;
   
function LastDownloadError(): Integer;
begin
   
Result := downloadError;
end;
/////////////////////////////////////////////////////////////////////////////////////

const
   
FILESIZE_BUFF_LEN = 30;
    UNDEF_FILE_SIZE = -1;
   
function InternetFileSize
(
    const hOpenedInet: HINTERNET; // in // with INTERNET_OPEN_TYPE_PRECONFIG flag
   
const urlFile: String;    // in
   
var FileSize: Extended; // out
   
var hOpenedFile: HINTERNET // out
): Boolean;
var
   
Buff: AnsiString;
    dwBufLen, dwReserved: DWORD;
begin
   
Result := False;
    FileSize := UNDEF_FILE_SIZE;

    SetLength(Buff, FILESIZE_BUFF_LEN);
    dwBufLen := DWORD(FILESIZE_BUFF_LEN);

    hOpenedFile := InternetOpenUrl( hOpenedInet, urlFile, '', 0, 0, 0 );
    if hOpenedFile = 0 then
    begin
       
downloadError := DOWNLOAD_ERROR_DOWNLOAD_URL_IS_NOT_VALID_URL;
        Exit;
    end;

    if HttpQueryInfo( hOpenedFile, HTTP_QUERY_CONTENT_LENGTH, Buff, dwBufLen, dwReserved ) then
    begin
       
FileSize := StrToFloat( Trim(Buff) );
        Result := True;
    end;
end;

function InternetFilesSizes
(
    const hOpenedInet: HINTERNET; // in // with INTERNET_OPEN_TYPE_PRECONFIG flag
   
const urlFiles: array of String; // in
   
const urlFilesCount: Integer; // in
   
var TotalBytes: Extended;  // out
   
var FileBytes: array of Extended;  // out
   
var hOpenedFile: array of HINTERNET  // out
): Boolean;
var
   
i, e: Integer;
begin
   
Result := True;
    TotalBytes := 0;
   
    SetArrayLength(FileBytes, urlFilesCount);
    SetArrayLength(hOpenedFile, urlFilesCount);
   
    for i := 0 to urlFilesCount-1 do
    begin
       
Result := Result and InternetFileSize(hOpenedInet, urlFiles[i], FileBytes[i], hOpenedFile[i]);
        if not Result then
        begin
            for
e := 0 to i-1 do
             
InternetCloseHandle(hOpenedFile[e]);
             
            Break;
        end;
       
        TotalBytes := TotalBytes + FileBytes[i];
    end;
end;



const
   
MEGABYTE = 1024;
    READ_WRITE_FILE_BUFF_SIZE = MEGABYTE;
   
    // download messages
   
DOWNLOAD_PREPARING = 2;
    DOWNLOAD_IN_PROGRESS = 4;
    DOWNLOAD_IN_PROGRESS_NEXT_FILE = 8;
    DOWNLOAD_FINISHED = 16;
   

function DownloadFiles
(
    const urlFiles: array of String// массив ссылок на закачку
   
const dstFiles: array of string// массив путей сохраняемых файлов (каждый файл должен соответствовать соответствующей ссылке!)
   
const SkipExistingFiles: Boolean;  // пропуск существующих файлов (True-да)
   
const CallBack: _DOWNLOAD_CALLBACK // указатель на функцию обратного вызова или nil
): Boolean;
var
   
i: Integer;
   
    TotalBytes, TotalBytesWritten: Extended;
    FileBytes: array of Extended;
    FileBytesWritten: Extended;
   
    hOpenedFile: array of HINTERNET;
    hOpenedInet: HINTERNET;
   
    urlFilesCount: Integer;
   
    dstFileStream: TFileStream;
    dwNumberOfBytesRead: DWORD;
    Buff: AnsiString;
   
    AbortedWhileWriting: Boolean;
begin
   
Result := False;
    AbortedWhileWriting := False;
   
   
    hOpenedInet := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
    if hOpenedInet = 0 then Exit;
    try
        if
CallBack <> nil then // callback
         
if not CallBack(DOWNLOAD_PREPARING, '', UNDEF_FILE_SIZE, UNDEF_FILE_SIZE, UNDEF_FILE_SIZE, UNDEF_FILE_SIZE) then
            begin
               
downloadError := DOWNLOAD_ERROR_ABORTED_BY_USER;
                Exit;
            end
   
        urlFilesCount := GetArrayLength(urlFiles);
        if not InternetFilesSizes(hOpenedInet, urlFiles, urlFilesCount, TotalBytes, FileBytes, hOpenedFile) then Exit;

        SetLength(Buff, READ_WRITE_FILE_BUFF_SIZE);
       
        if CallBack <> nil then TotalBytesWritten := 0; // callback
       
       
for i := 0 to urlFilesCount-1 do // download
       
begin
           
            if
CallBack <> nil then // callback
           
begin
               
FileBytesWritten := 0;
               
                if not CallBack
                (
                    DOWNLOAD_IN_PROGRESS_NEXT_FILE,
                    dstFiles[i],
                    FileBytes[i],
                    UNDEF_FILE_SIZE,
                    TotalBytes,
                    TotalBytesWritten
                ) then
                begin
                   
downloadError := DOWNLOAD_ERROR_ABORTED_BY_USER;
                    Exit;
                end;
            end;
           
            if FileExists(dstFiles[i]) then
              if
SkipExistingFiles then Continue
              else
              if not
DeleteFile(dstFiles[i]) then
              begin
                 
downloadError := DOWNLOAD_ERROR_COULD_NOT_DELETE_EXISTING_FILE;
                  Exit;
              end;

       
            dstFileStream := TFileStream.Create(dstFiles[i], fmCreate);
            try
                repeat

                   
InternetReadFile(hOpenedFile[i], Buff, READ_WRITE_FILE_BUFF_SIZE, dwNumberOfBytesRead);
                    dstFileStream.Write(Buff, dwNumberOfBytesRead);
                   
                    if CallBack <> nil then // callback
                   
begin
                       
IncEx( TotalBytesWritten, Integer(dwNumberOfBytesRead) );
                        IncEx( FileBytesWritten, Integer(dwNumberOfBytesRead) );
                       
                        if not CallBack
                        (
                            DOWNLOAD_IN_PROGRESS,
                            dstFiles[i],
                            FileBytes[i],
                            FileBytesWritten,
                            TotalBytes,
                            TotalBytesWritten
                        ) then
                        begin
                           
downloadError := DOWNLOAD_ERROR_ABORTED_BY_USER;
                            AbortedWhileWriting := True;
                            Exit;
                        end;
                    end;
                   
                until (dwNumberOfBytesRead = 0);
            finally
               
InternetCloseHandle(hOpenedFile[i]);
                dstFileStream.Free;
               
                if AbortedWhileWriting then DeleteFile(dstFiles[i]);
            end;
           
        end;
       
        Result := True;
        if CallBack <> nil then // callback
         
CallBack(DOWNLOAD_FINISHED, '', UNDEF_FILE_SIZE, UNDEF_FILE_SIZE, UNDEF_FILE_SIZE, UNDEF_FILE_SIZE); 
           
    finally
       
InternetCloseHandle(hOpenedInet);
    end;
end;


///////////////////////////////////////////////////////////// demo ///////////////////////////////////////////////////////////////////////

var
   
FilePrpgressBar, TotalProgressBar: TNewProgressBar;
    FileStatic: TNewStaticText;
   

function _DownloadCallBack(
    const StatusMessage: Integer;
    const dstFile: String;
    const FileBytes: Extended;
    const FileBytesWritten: Extended;
    const TotalBytes: Extended;
    const TotalBytesWritten: Extended
): Boolean;
begin
    case
StatusMessage of
       
DOWNLOAD_PREPARING: FileStatic.Caption := 'Preparing download...';
   
        DOWNLOAD_IN_PROGRESS:
        begin
           
TotalProgressBar.Position := Round( (TotalProgressBar.Max*TotalBytesWritten) / TotalBytes );
            FilePrpgressBar.Position := Round( (FilePrpgressBar.Max*FileBytesWritten) / FileBytes );
        end;
       
        DOWNLOAD_IN_PROGRESS_NEXT_FILE:
        begin
           
WizardForm.Caption := WizardForm.Caption + ' :) ';
            FileStatic.Caption := dstFile;
        end;
   
        DOWNLOAD_FINISHED: MsgBox('Download Finished!', mbInformation, MB_OK);
    end;
   
    Application.ProcessMessages;
   
    Result := not Application.Terminated;
end;
   

procedure DownloadBtnClick(Sender: TObject);
begin
   
DownloadFiles
      ( ['http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe',
        '',
        'http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe',
        'http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe'
        ]
      ,['C:\test1.exe',
        'C:\test2.exe',
        'C:\test3.exe',
        'C:\test4.exe'
        ],
        False,
        @_DownloadCallBack
    );
end;
   

procedure InitializeWizard();
begin
    with
WizardForm do
    begin
       
OuterNotebook.Hide;

        WizardForm.Caption := '';
       
        TotalProgressBar := TNewProgressBar.Create(WizardForm);
        with TotalProgressBar do
        begin
           
Parent := WizardForm;
            SetBounds(10,10,WizardForm.ClientWidth-20,25);
            Max := 1000;
        end;
       
        FilePrpgressBar := TNewProgressBar.Create(WizardForm);
        with FilePrpgressBar do
        begin
           
Parent := WizardForm;
            SetBounds(10,40,WizardForm.ClientWidth-20,25);
        end;
       
        FileStatic := TNewStaticText.Create(WizardForm)
        with FileStatic do
        begin
           
Parent := WizardForm;
            Left := 15;
            Top := 77;
        end;
       
        with TButton.Create(WizardForm) do
        begin
           
Parent := WizardForm;
            SetBounds((WizardForm.ClientWidth-77) div 2, 270, 77, 25);
            Caption := 'Download';
            OnClick := @DownloadBtnClick;
        end;
    end;
   
   
   
end;



El Sanchez, ты тогда говорил:
Цитата:

Цитата El Sanchez
P.S. Вообще-то пример в шапке устарел, заменю его как-нибудь. »

Теперь, думаю, нет необходимости :)
Предлагаю добавить код в шапку (с заменой, если сочтёшь нужным), тк он может многим пригодиться
PS:
только я так и не понял зачем нужен флаг в твоём коде InternetOpenUrl(... INTERNET_FLAG_NEED_FILE ), когда уже непосредственно получаешь указатель на файл для скачивания?
на MSDN сказано "Causes a temporary file to be created if the file cannot be cached". Не пойму я. Можешь пожалуйста объяснить:
"Создание временного файла, если он не может быть кэширован"?

Nordek 05-12-2013 19:51 2267590

Shkutu
Цитата:

Цитата Shkutu
Должен быть один) »

Он тебе ничего не должен.
Код:

//Пример событий имеющие дубликацию
procedure InitializeWizard();
begin
 
InitializeWizard1();
//  InitializeWizard2();
//  InitializeWizard3();
//  InitializeWizard4();
//  InitializeWizard5();
end;

function InitializeSetup(): Boolean;
begin
 
Result := InitializeSetup1(); if not Result then exit;
//  Result := InitializeSetup2(); if not Result then exit;
//  Result := InitializeSetup3(); if not Result then exit;
//  Result := InitializeSetup4(); if not Result then exit;
//  Result := InitializeSetup5(); if not Result then exit;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
 
CurPageChanged1(CurPageID);
//  CurPageChanged2(CurPageID);
//  CurPageChanged3(CurPageID);
//  CurPageChanged4(CurPageID);
//  CurPageChanged5(CurPageID);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
 
CurStepChanged1(CurStep);
//  CurStepChanged2(CurStep);
//  CurStepChanged3(CurStep);
//  CurStepChanged4(CurStep);
//  CurStepChanged5(CurStep);
end;

procedure DeinitializeSetup();
begin
 
DeinitializeSetup1();
//  DeinitializeSetup2();
//  DeinitializeSetup3();
//  DeinitializeSetup4();
//  DeinitializeSetup5();
end;

т.е те кто пользуется для совмещения скриптов программой Joiner, так и будет:
Код:

// --- 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: Inno Setup Script (2).iss ------------------------------------------------------------
procedure InitializeWizard1();
begin
  with
WizardForm.GroupEdit do
  begin
   
Top := ScaleY(84);
  end;
end;


// --- Source: Inno Setup Script.iss ------------------------------------------------------------
procedure InitializeWizard2();
begin
  with
WizardForm.DirEdit do
  begin
   
Top := ScaleY(84);
  end;
end;


// --- Dispatching code ------------------------------------------------------------

procedure InitializeWizard();
begin
 
InitializeWizard1();
  InitializeWizard2();
end;

ведь новички не знают как совмещать, вот и пользуются Joiner, вместо того чтоб сделать
так:
Код:

procedure InitializeWizard();
begin
  with
WizardForm.DirEdit do
  begin
   
Top := ScaleY(84);
  end;
 
  with WizardForm.GroupEdit do
  begin
   
Top := ScaleY(84);
  end;

или так:
Код:

procedure InitializeWizard();
begin
 
WizardForm.DirEdit.Top := ScaleY(84);
  WizardForm.GroupEdit.Top := ScaleY(84);
end;


Dimas2011 05-12-2013 20:15 2267605

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

#define ArcExtract "17"
#define ZipExtract "0"
#define SrepExtract "0"
#define RepExtract "0"
#define PrecompExtract "0"
#define OggDecode "0"
#define TakDecode "0"
#define ZipPak "0"

#define IsExtractBarMax "17"

;; ниже имя игры
#define MyAppName "test"
;; ниже версия
#define MyAppVersion "1.0"
;; ниже автор
#define MyAppPublisher "test"
;; ниже имя exe файла, на кторорый ссылается ярлык
#define MyAppExeName "WotLa.exe"
;; ниже версия, которая записывается в свойствах
#define vers1 "1.1.1.2"
;; ниже сколько требуется места на установку, в МБ
#define NeedSize1 "16000"
;Цвет инсталятора
#define colour "clblack"

[Setup]
AppName={#MyAppName}
AppverName={#MyAppVersion}
AppVersion={#MyAppVersion}
VersionInfoVersion={#vers1}
VersionInfoTextVersion={#vers1}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
WizardSmallImageFile=Files\WizardSmallImage.bmp
SetupIconFile=Files\icon.ico
WizardImageFile=Files\WizardImg.bmp
ShowTasksTreeLines=yes
OutputDir=Output
AllowCancelDuringInstall=no

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Types]
Name: full; Description: Full installation; Flags: iscustom


[Components]
Name: g0; Description: Тест; Flags: dontinheritcheck
Name: g0\c1; Description: A; Flags: exclusive
Name: g0\c2; Description: B; Flags: exclusive
Name: g0\c3; Description: C; Flags: exclusive
Name: g0\c4; Description: D; Flags: exclusive


[Files]
Source: Files\A.bmp; Flags: dontcopy nocompression
Source: Files\B.bmp; Flags: dontcopy nocompression
Source: Files\C.bmp; Flags: dontcopy nocompression
Source: Files\D.bmp; Flags: dontcopy nocompression
Source: Files\logo.bmp; Flags: dontcopy
Source: Files\BASS.dll; Flags: dontcopy
Source: Files\sound.mp3; Flags: dontcopy nocompression
Source: Files\MusicButton.bmp; Flags: dontcopy
Source: Files\DirBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy
Source: Files\GroupBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy
///////////////////////////////////////////////////////Файлы для распаковки======================================================================

;;-----------------------------------------------------------///////////////////////////--------------------------------------------------------
[CustomMessages]
rus.WelcomeLabel1=
rus.WelcomeLabel2=
rus.FinisLabel1=
rus.FinisLabel2=

rus.Tasks1=Установить &PhysX
rus.Tasks2=Установить &Microsoft Visual C++ Redist
rus.Tasks3=Обновить &DirectX (требуется интернет соединение)
rus.Prog=Дополнительное программное обеспечение:

rus.NeedSpace=Требуется места на диске:
rus.FreeSpace=Доступно места на диске:

rus.ru1=В пути установки присутствуют русские буквы, что недопустимо.
rus.ru2=Пожалуйста, повторите ввод.

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

[code]
#ifdef colour
const
Color = {#colour}; //===Цвет инсталятора=======
#endif


//==================================================================Начало разметка формы=================================================================
var
FLabel1, FLabel2, WLabel1, WLabel2, PageNameLabel, PageDescriptionLabel,NeedSpaceLabel,FreeSpaceLabel: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
LogoImage: TBitmapImage;

ProgressBar1:TNewProgressBar;

const SmallWidth = 497;
//////---------------------------------------------------- музыка в инсталяторе
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;
AppPath: string;

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
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
end;
procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
PauseImage.Left := -32
end;

procedure PlayButtonOnClick(Sender: TObject);
begin
case BASS_ChannelIsActive(mp3Handle) of
BASS_ACTIVE_PAUSED:
begin
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 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


end;

function InitializeSetup1(): 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 DeinitializeSetup1();
begin
BASS_Stop();
BASS_Free();
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:FreeSpace}')+ ' ' + FloatToStr(round(FreeMB/1024*100)/100) + ' Gb' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSpace}') + ' ' + 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 := ExpandConstant('{cm:NeedSpace}') + ' ' + FloatToStr(round(NeedSize/1024*100)/100) + ' Mb' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace}') + ' ' + IntToStr(NeedSize)+ ' Mb';
end;

procedure InitializeWizard1();
begin
with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;
ProgressGauge.Hide;
FileNameLabel.Hide;
StatusLabel.Top:=ScaleY(20);
WizardForm.DiskSpaceLabel.Hide;
end;

with WizardForm do
begin
WizardBitmapImage.Width := ScaleY (498);
WizardBitmapImage.Height := ScaleX (314);
WizardBitmapImage2.Width := ScaleY (498);
WizardBitmapImage2.Height := ScaleX (314);
WizardSmallBitmapImage.Left:= WizardForm.WizardSmallBitmapImage.Left - (SmallWidth - WizardForm.WizardSmallBitmapImage.Width) + 2 WizardSmallBitmapImage.Width:= SmallWidth
end;

begin
WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := ScaleX(40);
WLabel1.Top := ScaleY(150);
WLabel1.Width := ScaleX(240);
WLabel1.Height := ScaleY(100);
WLabel1.AutoSize := False;
WLabel1.WordWrap := True;
WLabel1.Font.Size := 8;
WLabel1.Font.Style := [fsBold];
WLabel1.Font.Color:= clWhite;
WLabel1.Font.Name:= 'Comic Sans MS'
WLabel1.ShowAccelChar := False;
WLabel1.Caption :=ExpandConstant('{cm:WelcomeLabel1}');
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.WelcomePage;

WLabel2 :=TLabel.Create(WizardForm);
WLabel2.Top := ScaleY(190);
WLabel2.Left := ScaleX(40);
WLabel2.Width := ScaleX(240);
WLabel2.Height := ScaleY(234);
WLabel2.AutoSize := False;
WLabel2.WordWrap := True;
WLabel2.Font.Size := 8;
WLabel2.Font.Style := [fsBold];
WLabel2.Font.Color:= clWhite;
WLabel2.Font.Name:= 'Comic Sans MS'
WLabel2.ShowAccelChar := False;
WLabel2.Caption := ExpandConstant('{cm:WelcomeLabel2}');
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.WelcomePage;

FLabel1 := TLabel.Create(WizardForm);
FLabel1.Left := ScaleX(40);
FLabel1.Top := ScaleY(150);
FLabel1.Width := ScaleX(240);
FLabel1.Height := ScaleY(54);
FLabel1.AutoSize := False;
FLabel1.WordWrap := True;
FLabel1.Font.Size := 8;
FLabel1.Font.Name := 'Comic Sans MS'
FLabel1.Font.Style := [fsBold];
FLabel1.Font.Color:= clWhite;
FLabel1.ShowAccelChar := False;
FLabel1.Caption := ExpandConstant('{cm:FinisLabel1}');
FLabel1.Transparent := True;
FLabel1.Parent := WizardForm.FinishedPage;

FLabel2 :=TLabel.Create(WizardForm);
FLabel2.Top := ScaleY(190);
FLabel2.Left := ScaleX(40);
FLabel2.Width := ScaleX(240);
FLabel2.Height := ScaleY(77);
FLabel2.AutoSize := False;
FLabel2.WordWrap := True;
FLabel2.Font.Size := 8;
FLabel2.Font.Name := 'Comic Sans MS'
FLabel2.Font.Style := [fsBold];
FLabel2.Font.Color:= clWhite;
FLabel2.ShowAccelChar := False;
FLabel2.Caption := ExpandConstant('{cm:FinisLabel2}');
FLabel2.Transparent := True;
FLabel2.Parent := WizardForm.FinishedPage;
end;

PageNameLabel:= TLabel.Create(WizardForm);
with PageNameLabel do
begin
SetBounds(WizardForm.PageNameLabel.Left, WizardForm.PageNameLabel.Top, WizardForm.PageNameLabel.Width - 32, WizardForm.PageNameLabel.Height)
AutoSize:= False; WordWrap:= True; Transparent:= True;
Font.Color:= clWhite;
Font.Style:= WizardForm.PageNameLabel.Font.Style;
Parent:= WizardForm.MainPanel;
end;

PageDescriptionLabel:= TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
SetBounds(WizardForm.PageDescriptionLabel.Left, WizardForm.PageDescriptionLabel.Top, WizardForm.PageDescriptionLabel.Width - 32, WizardForm.PageDescriptionLabel.Height)
AutoSize:= False; WordWrap:= True; Transparent:= True;
Font.Color:= clWhite;
Font.Style:= WizardForm.PageDescriptionLabel.Font.Style;
Parent:= WizardForm.MainPanel;
end;

Music //музыка в инсталяторе
NeedSize := {#NeedSize1};

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;
with WizardForm do
begin
DirEdit.OnChange := @GetFreeSpaceCaption;
DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

ProgressBar1:=TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar1.Left := WizardForm.ProgressGauge.Left;
ProgressBar1.Top := WizardForm.ProgressGauge.Top;
ProgressBar1.min:=0;
ProgressBar1.Width :=WizardForm.ProgressGauge.Width;
ProgressBar1.Height := WizardForm.ProgressGauge.Height;
ProgressBar1.Parent := WizardForm.InstallingPage;
ProgressBar1.Max:=4;
end;


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

end;
end;


Procedure CurPageChanged1(CurPageID: Integer);
Begin
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;

begin
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;end;
end;
//=======================================Конец разметка формы=======================================

function NextButtonClick1(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 := ExpandConstant('{cm:ru1}')+#13#13+ExpandConstant('{cm:ru2}');
MsgBox(s, mbError, mb_Ok);
Result := False ; //Запрет перехода на следующую страницу
exit;
end
else Result := True; //Разрешаем переход на следующую страницу
end;
end;
end;
// --- Конец скрипта ------------------------------------------------------------
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
end;

procedure DeinitializeSetup();
begin
DeinitializeSetup1();
end;

procedure InitializeWizard();
begin
//=================================================Начало папки=======================================
ExtractTemporaryFile('DirBitmap.bmp');
ExtractTemporaryFile('GroupBitmap.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\DirBitmap.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;

WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\GroupBitmap.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
//===================================Конец папки=====================

/////////////////////////////////////Чёрный инсталятор///////////////////////////////////////////////////
#ifdef colour
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.WelcomeLabel1.Font.Color:=clWhite;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clWhite;
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.PageNameLabel.Font.Color:=clWhite;
end;
#endif
//////////////////////////////////////////////Конец чёрный инсталятор///////////////////////////////////////////////////////////////

InitializeWizard1();

end;


procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);

end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := NextButtonClick1(CurPageID); if not Result then exit;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin

end;

Johny777 05-12-2013 20:55 2267629

Nordek,
Цитата:

Цитата Nordek
У тебя InitializeWizard не один? »

Цитата:

Цитата Shkutu
Должен быть один) »

Цитата:

Цитата Nordek
//Пример событий имеющие дубликацию »

Shkutu права. Например та же процедура procedure InitializeWizard(); может быть только одна с таким названием
тк инно не поддерживает перегрузку (http://www.delphibasics.ru/Overload.php), и даже не в этом дело. Если б компилятор допускал одинаковые названия глобальных переменных, констант, функций/процедур не отличающихся друг от друга по вызову, такой код если б работал бы, то в режиме хаоса и анархии.
то что у тебя в коде это вызов одних процедур из других
например это
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
 
CurPageChanged1(CurPageID);
//  CurPageChanged2(CurPageID);
//  CurPageChanged3(CurPageID);
//  CurPageChanged4(CurPageID);
//  CurPageChanged5(CurPageID);
end;

////////////////////////////////////////////////////////////

function InitializeSetup(): Boolean;
begin
 
Result := InitializeSetup1(); if not Result then exit;
//  Result := InitializeSetup2(); if not Result then exit;
//  Result := InitializeSetup3(); if not Result then exit;
//  Result := InitializeSetup4(); if not Result then exit;
//  Result := InitializeSetup5(); if not Result then exit;
end;


тоже самое, что и это:
читать дальше »
Код:

procedure  Johny(CurPageID: Integer);
begin
   
//...
end;
procedure  Nordek(CurPageID: Integer);
begin
   
//...
end;
procedure  SomeProc(CurPageID: Integer);
begin
   
//...
end;
procedure  BadProc(CurPageID: Integer);
begin
   
//...
end;
 
procedure CurPageChanged(CurPageID: Integer);
begin
 
Johny(CurPageID);
  Nordek(CurPageID);
  SomeProc(CurPageID);
  BadProc(CurPageID);
  //..
end;

/////////////////////////////////////////////////////////////////////////////

function A(): Boolean;
begin

end
;
function B(): Boolean;
begin

end
;
function C(): Boolean;
begin

end
;
function InitializeSetup(): Boolean;
begin
 
Result := InitializeSetup1(); if not Result then exit;
//  Result := A(); if not Result then exit;
//  Result := B(); if not Result then exit;
//  Result := C(); if not Result then exit;

end;


Дубликация в моём понимании - это например копирование одного участка памяти по адресу в другой такого-же размера. Вот только в том и дело - это копирование (называем действия своими именами), а не дубликация
в Си-шке есть strdup например...
и на будущее будь внимательнее, чтоб тебе по ушам не ездили с мифическими терминами типа "дубликации событий", тк это может сказаться на твоём восприятии кода, который по сути без подобных терминов всегда очень логичен! :)

Nordek 05-12-2013 21:03 2267632

Цитата:

Цитата Johny777
procedure InitializeWizard(); может быть только одна с таким названием »

Johny777,
читать дальше »
Это родитель будет только один
Код:

procedure InitializeWizard();
а потомков от него сколько угодно
Код:

begin
 
InitializeWizard1();
  InitializeWizard2();
  InitializeWizard3();
  InitializeWizard4();
  InitializeWizard5();
end;

да и не мне тебе рассказывать.

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



На скрине сразу виден был весь скрипт?
На скриншоте указан был только кусок кода:
Код:

//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
 
with WizardForm do begin
    with
BeveledLabel do begin
   
Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;
end;
  var
Page: TOutputMsgMemoWizardPage;
//procedure InitializeWizard();
begin
 
Page := CreateOutputMsgMemoPage(wpSelectComponents,
  'Предупреждение!', '',
  '', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageFromID(PageID) of
       
Page: Result := not IsComponentSelected('Framework\4');
    end;
end;

так ещё процедура procedure InitializeWizard(); была закомментирована //procedure InitializeWizard();, что там выше и ниже было, оставалось только догадываться.

Не всегда код может быть таким
Код:

procedure InitializeWizard();
begin
  with
WizardForm.DirEdit do
  begin
   
Top := ScaleY(92);
  end;
end;

может быть и таким
Код:

procedure RedesignWizardForm;
begin
  with
WizardForm.DirEdit do
  begin
   
Top := ScaleY(92);
  end;
end;















procedure InitializeWizard();
begin
 
RedesignWizardForm;
end;

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

habib2302 05-12-2013 21:26 2267646

Dimas2011,

Nordek 05-12-2013 21:52 2267659

Цитата:

Цитата Dimas2011
Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка? »

Dimas2011, какая-то странная мода пошла. Вас там ещё много?
Сообщения #662 в шапке явно не хватает.

Цитата:

Цитата Dimas2011
сделайте хотябы для одного элемента плыз »

#1560.

Johny777 05-12-2013 22:00 2267664

Nordek,
читать дальше »
Цитата:

Цитата Nordek
Это родитель будет только один, а потомков от него сколько угодно»

извращение понятий.
давай поговорим об абстрактном
термин родитель/предок --> наследник/потомок применим к классам в ООП
Например ты написал визуальный класс - "Кнопка" (у которой например нет возможность менять цвет),
type
TButton = class(TWinControl)
private
// методы и свойства
public
// методы и свойства
end;
но потом понял, что помимо неё ещё нужна более продвинутая
со свойством "цвет", "прозрачность" + всё то, что есть у TButton (текст, хинт,...)
чтоб не писать заново класс ты пишешь наследника TColorButton = class(TButton)
TColorButton наследует все методы и свойства TButton + теперь уже в классе TColorButton ты описываешь те дополнительные свойства, ради чего ты её сабклассил
понимаешь теперь,
не подумай, что я придираюсь к словам. От души тебе желаю, чтоб ты в будущем создавал свои классы, но чтоб при этом у тебя не было путаницы в голове, чтоб
вызов одной процедуры/функции из другой для тебя был бы вызов одной процедуры/функции из другой, а не дубликация
и понятия родитель - потомок ассоциировались с тем самым (о чём я только что говорил)
Цитата:

Цитата Nordek
Восприятие каждого относительно. »

согласен. На тему восприятия другой пример:
код пишется как правило для себя, но не всегда (иногда выложишь в свободный доступ, захочешь когда-нибудь переписать, или будут проблемы - спросишь например на форуме)
к примеру у тебя вызов
begin
InitializeWizard1(); // извлечение картинок
InitializeWizard2(); // создание страницы
end;
это "быдлокод" http://otvet.mail.ru/question/62758337 (во втором сообщении одна из особенностей)
(я не раз при чтении чужого скрипта для его исправления, запутывался во всех этих невнятных названиях. Само по себе чтение чужого кода - штука невесёлая, даже если он нормально написан )
не будет ли более ясным такой вызов?
begin
ExtractPictures(); // извлечение картинок
CreatePage(); // создание страницы
end;
еще как будет!

Цитата:

Цитата Nordek
какая-то странная мода пошла. Вас там ещё много?
Сообщения #662 в шапке явно не хватает. »

поддерживаю! :laugh:

El Sanchez 05-12-2013 22:39 2267694

Цитата:

Цитата Johny777
Предлагаю добавить код в шапку (с заменой, если сочтёшь нужным), тк он может многим пригодиться »

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

Цитата Johny777
только я так и не понял зачем нужен флаг в твоём коде InternetOpenUrl(... INTERNET_FLAG_NEED_FILE )»

Johny777, ну, игрался с флагами, с этим флагом файл кешируется на прокси (при наличии прокси) или создается временный файл (при отсутствии прокси), сейчас этот флаг не использую.
Цитата:

Цитата Johny777
когда уже непосредственно получаешь указатель на файл для скачивания? »

Johny777, флаги влияют на свойства получаемого дескриптора файла.
Цитата:

Цитата Johny777
El Sanchez, ты тогда говорил:
Цитата El Sanchez:
P.S. Вообще-то пример в шапке устарел, заменю его как-нибудь. » »

Ну раз обещал, последняя моя версия:
читать дальше »

Код:

[Setup]
AppName=test
AppVerName=test
CreateAppDir=false
DefaultDirName={tmp}
Uninstallable=false

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

[code]
#define A = (Defined UNICODE) ? "W" : "A"
const
   
INTERNET_OPEN_TYPE_PRECONFIG = 0;
    INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
    INTERNET_FLAG_PRAGMA_NOCACHE = $100;
    INTERNET_FLAG_RELOAD = $80000000;
    INTERNET_FLAG_NEED_FILE = $10;
    INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
    HTTP_QUERY_FLAG_NUMBER = $20000000;
    HTTP_QUERY_LOCATION = 33;
    HTTP_QUERY_CONTENT_LENGTH = 5;
    HTTP_QUERY_STATUS_CODE = 19;
    ERROR_INSUFFICIENT_BUFFER = 122;
    HTTP_STATUS_OK = 200;
    HTTP_STATUS_REDIRECT = 302;
    GENERIC_READ = $80000000;
    GENERIC_WRITE = $40000000;
    CREATE_ALWAYS = 2;
    HEAP_ZERO_MEMORY = $8;
    IRF_SYNC = $4;

type
   
INTERNET_BUFFERS = record
       
dwStructSize: DWORD;
        Next: Longint;
        lpcszHeader: String;
        dwHeadersLength: DWORD;
        dwHeadersTotal: DWORD;
        lpvBuffer: Longint;
        dwBufferLength: DWORD;
        dwBufferTotal: DWORD;
        dwOffsetLow: DWORD;
        dwOffsetHigh: DWORD;
    end;

var
   
g_DownloadPage: TOutputProgressWizardPage;

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: String; dwFlags: DWORD): Integer; external 'InternetOpen{#A}@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Longint; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: DWORD_PTR): Integer; external 'InternetOpenUrl{#A}@wininet.dll stdcall';
function InternetReadFileEx(hFile: Longint; var lpBuffersOut: INTERNET_BUFFERS; dwFlags: DWORD; dwContext: DWORD_PTR): BOOL; external 'InternetReadFileEx{#A}@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Longint): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; var lpvBuffer: Longint; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function _HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; lpvBuffer: String; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function StrFormatByteSize64(qdw: Currency; pszBuf: AnsiString; cchBuf: UINT): Longint; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function StrFromTimeInterval(pszOut: String; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function CreateFile(lpFileName: String; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: Longint; dwCreationDisposition, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@kernel32.dll stdcall';
function WriteFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: Longint): BOOL; external 'WriteFile@kernel32.dll stdcall';
function GetProcessHeap(): THandle; external 'GetProcessHeap@kernel32.dll stdcall';
function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint; external 'HeapAlloc@kernel32.dll stdcall';
function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL; external 'HeapFree@kernel32.dll stdcall';
function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD; external 'HeapSize@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';

///////////////////////////////////////////////////
function TicksToTime(const dwTicks: DWORD): String;
begin
   
Result := StringOfChar(#0, StrFromTimeInterval(Result, 0, dwTicks, 8));
    StrFromTimeInterval(Result, Length(Result)+1, dwTicks, 8);
end;

////////////////////////////////////////////////////////
function BytesToSize(const exBytes: Double): AnsiString;
begin
   
Result := StringOfChar(#0, 15);
    if Abs(exBytes) > 9.223372036854775807E18 then exBytes := 0;
#ifdef UNICODE
   
Result := CastIntegerToAnsiString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#else
   
Result := CastIntegerToString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#endif
end;

////////////////////////////////////////////////////
function DownloadFile(const szURL: String): Boolean;
var
   
hConnect, hSession, hFile, hHeap: THandle;
    szHeader, szFileName: String;
    dwBufferLength, dwIndex, dwStartDownload, dwStart, dwElapsed, dwWritten: DWORD;
    lpBuffer, lpStatus, lpSize: Longint;
    ib: INTERNET_BUFFERS;
begin
    try
       
hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
        if hSession = 0 then Exit;

        // additional header
       
szHeader := 'Referer: http://example.org/'#13#10;

        // try direct link
       
repeat
           
hConnect := InternetOpenUrl(hSession, szURL, szHeader, Length(szHeader), INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
            if hConnect = 0 then Exit;
            dwBufferLength := SizeOf(lpBuffer);
            dwIndex := 0;
            lpStatus := 0;
            if not HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, lpStatus, dwBufferLength, dwIndex) then Exit;
            lpBuffer := 0;
            HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, lpBuffer, dwBufferLength, dwIndex);
            if DLLGetLastError = ERROR_INSUFFICIENT_BUFFER then
            begin
               
szURL := StringOfChar(#0, dwBufferLength-1);
                if not _HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, szURL, dwBufferLength, dwIndex) then Exit;
                if lpStatus = HTTP_STATUS_REDIRECT then InternetCloseHandle(hConnect);
            end;
        until lpStatus = HTTP_STATUS_OK;

        // get file size
       
dwBufferLength := 4;
        dwIndex := 0;
        if not HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, lpSize, dwBufferLength, dwIndex) then Exit;

        // save dialog
       
szFileName := ExtractFileName(szURL);
        if GetSaveFileName('Сохранить как...', szFileName, '', Format('*%s', [ExtractFileExt(szFileName)]), ExtractFileExt(szFileName)) then
        try
           
hFile := CreateFile(szFileName, GENERIC_READ or GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);  //create file
           
if hFile = 0 then Exit;
            hHeap := GetProcessHeap();
            lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4*1024);    // buffer size must be >= 512Kb
           
ib.dwStructSize := SizeOf(ib);
            ib.lpvBuffer := lpBuffer;
            ib.dwBufferLength := HeapSize(hHeap, 0, lpBuffer);

            // show page
           
g_DownloadPage.Show;
            g_DownloadPage.ProgressBar.Show;
            g_DownloadPage.SetProgress(0, lpSize);

            // try download
           
try
               
// initial labels
               
g_DownloadPage.Msg1Label.Caption := Format(
                    'Файл:'#9#9'%s'#13#10 +
                    'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(0), BytesToSize(lpSize)]
                );
                g_DownloadPage.Msg2Label.Caption := Format(
                    'Прогресс:'#9'%s'#13#10 +
                    'Скорость:'#9'%s/сек'#13#10 +
                    'Прошло:'#9'0 сек'#13#10 +
                    'Осталось:'#9'%d сек', [FormatFloat('0.#0 %', MulDiv(g_DownloadPage.ProgressBar.Position, 100, lpSize)), BytesToSize(0), MaxInt]
                );
               
                // download
               
dwStartDownload := GetTickCount;
                while ib.dwBufferLength > 0 do
                begin
                   
dwStart := GetTickCount;
                    dwElapsed := 0;
                    while dwElapsed < 1000 do
                    begin
                       
// read file
                       
InternetReadFileEx(hConnect, ib, IRF_SYNC, 0);
                       
                        // write file
                       
WriteFile(hFile, ib.lpvBuffer, ib.dwBufferLength, dwWritten, 0);
                        ib.dwBufferTotal := ib.dwBufferTotal + dwWritten;

                        // update progressbar
                       
g_DownloadPage.ProgressBar.Position := ib.dwBufferTotal;
                       
                        // process messages
                       
Application.ProcessMessages;
                        dwElapsed := GetTickCount - dwStart;
                    end;

                    // update labels
                   
dwElapsed := GetTickCount-dwStartDownload;
                    g_DownloadPage.Msg1Label.Caption := Format(
                        'Файл:'#9#9'%s'#13#10 +
                        'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(ib.dwBufferTotal), BytesToSize(lpSize)]
                    );
                    g_DownloadPage.Msg2Label.Caption := Format(
                        'Прогресс:'#9'%d %%'#13#10 +
                        'Скорость:'#9'%s/сек'#13#10 +
                        'Прошло:'#9'%s'#13#10 +
                        'Осталось:'#9'%d сек', [MulDiv(ib.dwBufferTotal, 100, lpSize), BytesToSize(MulDiv(ib.dwBufferTotal, 1000, dwElapsed)), TicksToTime(dwElapsed), MulDiv(lpSize-ib.dwBufferTotal, dwElapsed, 1000)/(ib.dwBufferTotal + 1)]
                    );
                end;
            except
               
Result := False;    // error
           
finally
            end
;
        finally
           
CloseHandle(hFile);
            HeapFree(hHeap, 0, lpBuffer);
            Result := ib.dwBufferTotal = lpSize;    // success
       
end;
    except
       
Result := False;    // error
   
finally
       
InternetCloseHandle(hConnect);
        InternetCloseHandle(hSession);
        g_DownloadPage.Hide;
    end;
end;

/////////////////////////////////////
procedure CreateDownloadProgressPage;
begin
   
g_DownloadPage := CreateOutputProgressPage('Загрузка файла', '');
    with g_DownloadPage do
    begin
       
Msg1Label.Height := Msg1Label.Height shl 1;
        Msg2Label.Height := Msg2Label.Height shl 2;
        Msg2Label.Top := ProgressBar.Top + ProgressBar.Height + ScaleY(5);
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
   
CreateDownloadProgressPage();
end;

//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
   
Result := True;
    case CurPageID of
       
wpWelcome: DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe');
    end;
end;


Dinvin4ester 05-12-2013 22:40 2267698

Ребята , как прописать , чтобы после установки выходило два ехе файла на рабочий стол ?
Вот скрипт http://sendfile.su/905823

Nordek 05-12-2013 22:47 2267704

Johny777, Кстати, мне показалось или код немного не корректно отрабатывает? Имею ввиду относительно только одного компонента.

Цитата:

Цитата El Sanchez
редирект »

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

Johny777 05-12-2013 22:55 2267708

Цитата:

Цитата El Sanchez
на втором пустом элементе массива прямых ссылок будет выход и до свиданья закачки »

так и задумывалось. Те предполагается что если нужно скачать несколько файлов, то функция завершится успешно, если они скачались все!
тк что толку например с 1 файла из 3 если они все втроём составляют одно целое, но это исправить не долго,
я ж не знаю, тонкостей запроса Tco 03
Цитата:

Цитата El Sanchez
что у людей может интернет через прокси быть »

Цитата:

Цитата El Sanchez
про редирект ты тоже не знаешь »

как конкретно это учитывается?
Коду работы с интернетом я уделял только 2 раза внимание.
Потому пока ещё не знаю всех тонкостей

Nordek,
Цитата:

Цитата Nordek
Кстати, мне показалось или код немного не корректно отрабатывает? Имею ввиду относительно только одного компонента. »

вызов ShowPicHint() для всех компонентов одинаковый, картинка отображается в точке расположения курсора.
только-что проверил. Кажись всё в порядке.

улучшил код. Должен теперь быстрее работать, тк установка стиля и прозрачности теперь 1 раз при создании формы, а не каждый раз при показе
+ перезалил "наглядный пример"

Nordek 05-12-2013 23:16 2267719

Цитата:

Цитата Johny777
только-что проверил. Кажись всё в порядке. »

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

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
Compression=none
AppId=TheBestAppId
DisableWelcomePage=yes
DisableFinishedPage=yes
DisableDirPage=yes
DisableReadyPage=yes


[Components]
Name: a; Description: A


[Files]
Source: A.bmp; Flags: dontcopy nocompression


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

const
    UNDEF_INDEX = -777;
    ALPHA_BLEND_LEVEL = 128; // max=Byte=255

    WS_EX_LAYERED = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY = 1;
    LWA_ALPHA = 2;
    GWL_EXSTYLE = (-20);


var
    InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;


type
    COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with PicForm do
        begin
            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
        SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
    UndefPic: String;
begin
    if Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case TNewCheckListBox(Sender).ItemCaption[Index] of
            'A': UndefPic := 'A.bmp';
        else
            begin
                LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
        LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
    PicForm.Hide;
end;


procedure InitInfo();
begin
    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
        BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
            Parent := PicForm;
            AutoSize := True;
        end;
    end;
end;


procedure InitializeWizard();
begin
    InitInfo();
end;


Да вот смотрю, в первый раз картинка появляется. Потом отвожу курсор, ещё раз навожу и уже не появляется.
При трёх компонентах нормально.

Dinvin4ester,
Если файлы разные
Код:

[Files]
Source: Твой_файл1.exe; DestDir: {commondesktop}
Source: Твой_файл2.exe; DestDir: {commondesktop}

Если файл один и тот же
Код:

[Files]
Source: Твой_файл.exe; DestDir: {commondesktop}; DestName: Твой_файл1.exe
Source: Твой_файл.exe; DestDir: {commondesktop}; DestName: Твой_файл2.exe


Johny777 05-12-2013 23:24 2267722

Цитата:

Цитата Nordek
Да вот смотрю, в первый раз картинка появляется. Потом отвожу курсор, ещё раз навожу и уже не появляется. »

так сразу и сказал бы :)
благодарю за найденную ошибку!
в procedure CompOnMouseLeave(Sender: TObject); не хватало LastIndex := -1;
исправил, перезалил демо

http://forum.oszone.net/post-2169372-662.html

Dinvin4ester 05-12-2013 23:29 2267726

Вложений: 1
Nordek,
Спасибо , но что-то выдает ошибку .

Nordek 05-12-2013 23:40 2267731

Цитата:

Цитата Dinvin4ester
но что-то выдает ошибку . »

Я не могу угадать путь к твоему файлу exe.

А так?
Код:

Source: E:\Games 2\Четыре поросенка и коробка\Твой_файл1.exe; DestDir: {commondesktop}
Source: E:\Games 2\Четыре поросенка и коробка\Твой_файл2.exe; DestDir: {commondesktop}

эти строчки, добавляешь в секцию [Files].

Dinvin4ester 05-12-2013 23:46 2267734

Nordek,
Вот сейчас все подошло. Огромное спасибо вам .

tuz-veta 06-12-2013 00:14 2267754

Привет всем!
Нужна ваша помощь, например запускаю инсталлятор и устанавливаю компоненты которые мне надо.
Потом запускаю еще раз инсталлятор и снимаю галочки с тех компонентов которые я установил,
как сделать если я снимаю галочки с компонентов которые были установленные
то чтоб эти компоненты удалялись?
ЗАРАНЕЕ БОЛЬШОЕ СПАСИБО!

habib2302 06-12-2013 00:27 2267765

tuz-veta,
предварительное удаление только для твоего инсталла
Код:

[Setup]
AppId=by Xabib

[code  ]                         

function UninstallMyApp(): Boolean;
var
    Buff: String;
    i: Integer;
begin
    Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
    if not Result then Result := not FileExists(RemoveQuotes(Buff));
    if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDYES then
    try
        Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
    finally
        Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
        if not Result then MsgBox('Удаление завершилось неудачей!', mbError, MB_OK);
    end;
end;

function InitializeSetup(): Boolean;
begin
    Result := UninstallMyApp();
end;


tuz-veta 06-12-2013 00:57 2267779

habib2302,
Вы наверное не так меня поняли.
Мне надо удалять компоненты снятием галочки с компонента а не через unins000.exe

Tco 03 06-12-2013 03:15 2267818

Цитата:

Цитата Johny777
написал полностью код закачки с нуля на основе тех же функций из Wininet.h/Wininet.pas
двойной прогресс как ты и хотел, ...
сам код загрузки + демо»

Что-то у меня не работает... Висит надпись "Preparing download..." и всё, больше никаких действий! :meeting:
Цитата:

Цитата Johny777
я ж не знаю, тонкостей запроса Tco 03 »

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

Optitron 06-12-2013 05:27 2267835

Здравствуйте. Как сделать так, что кнопка "Далее" переименовывалась в "Установить" на посл. странице мастера перед установкой (при условии, что DisableReadyPage=yes).

Mat_y 06-12-2013 08:55 2267858

Добрый день.
Такой вопрос... реально ли в этом шаблоне установщика сделать прокрутку списка компонентов кнопками вверх/вниз (которые на форме нарисованы) и (или) колесиком мышки? Т.к. в данный момент реализован только ползунок.
Буду благодарен за помощь.

Цитата:

Цитата Optitron
Здравствуйте. Как сделать так, что кнопка "Далее" переименовывалась в "Установить" на посл. странице мастера перед установкой (при условии, что DisableReadyPage=yes). »

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

Procedure CurPageChanged(CurPageID: Integer);
begin
 if CurPageID = wpSelectTasks then
 begin
  WizardForm.NextButton.Caption:='Установить';
 end;
end;


Tco 03 06-12-2013 09:28 2267868

Цитата:

Цитата Tco 03
Что-то у меня не работает... Висит надпись "Preparing download..." и всё, больше никаких действий! »

Тут оказывается косяк! При нерабочем интернете (или рабочем, но не может связаться по ссылке с файлом) инсталлятор зависает! И выход из ситуации только "убить процесс".
Цитата:

Цитата Johny777
например с 1 файла из 3 если они все втроём составляют одно целое »

Ну три файла составляют одно целое, но если интернет отрубился, а до этого два файла успешно скачались, объёмом по 80 метров, скачивать заново те, что уже скачались? Тут по правилам нужно сделать какую-нибудь проверку... Ещё бы хотелось добавить фунцию повтора закачки, если при обрыве связи закачка одного из трёх файлов была прервана (соответственно нужно скачать только его (недокаченный)).

Цитата:

Цитата Johny777
ну всё, с тебя ящик бухла: »

:yes:

Johny777, Как в твоём примере нарисовать скорость загрузки?

Mat_y, А назад вернуть надпись кнопки!?
читать дальше »

Код:

Procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectTasks then
begin
  WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
end else begin
  WizardForm.NextButton.Caption:= WizardForm.NextButton.Caption;
end;
end;


Mat_y 06-12-2013 11:31 2267910

Цитата:

Цитата Tco 03
Mat_y, А назад вернуть надпись кнопки!? »

А автор не просил :) чтобы они еще и назад вернулись :)
З.Ы. А серьезно - просто забыл.

Johny777 06-12-2013 14:01 2268004

Tco 03,
Цитата:

Цитата Tco 03
Ну три файла составляют одно целое, но если интернет отрубился, а до этого два файла успешно скачались, объёмом по 80 метров, скачивать заново те, что уже скачались? Тут по правилам нужно сделать какую-нибудь проверку... Ещё бы хотелось добавить фунцию повтора закачки, если при обрыве связи закачка одного из трёх файлов была прервана (соответственно нужно скачать только его (недокаченный)). »

OK,
но повторюсь, интернет для меня тема в большей мере непознанная. я еще с переадресацией и прокси не разобрался.
http://forum.oszone.net/post-2267708-1631.html
код будет очень нескоро. Паси форум
Цитата:

Цитата Tco 03
Как в твоём примере нарисовать скорость загрузки? »

вычисляется статистически. Учитывая прошедшее время и тд. Типа как здесь оставшееся время вычисляется.
http://forum.oszone.net/post-2264978-1575.html
Потом добавлю в демо.
Цитата:

Цитата Johny777
Tco 03, ну всё, с тебя ящик бухла: »

временно отменяется. пока готовь 2 ящика! :)

Shkutu 06-12-2013 14:15 2268011

Доброго времени суток!
А нет ли у кого-нибудь случаем алгоритма кодирования в/декодирования base64 для инно?

Mat_y 06-12-2013 14:58 2268035

Ребят!
А можно ли вот эту часть кода
Код:

var
  InfoBMP: TBitmapImage;
  I_BMP : Array [0..10] of TBitmap;

которая призвана выводить картинки формата BMP при наведении на компонент (см. код ниже):
читать дальше »
Код:

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

procedure InitializeImageInfo;
var
  i : Integer;
begin
  with WizardForm do
  begin
    with ComponentsList do
    begin
      OnItemMouseMove := @ComponentsListItemMouseMove;
    end;
  end;

  InfoBMP := TBitmapImage.Create(WizardForm); //*****************************
  with InfoBMP do
  begin
    Parent := WizardForm.MainPanel;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(497), ScaleY(149));
    Stretch := true;
//    InfoBMP.Bitmap := I_BMP[0]; // 0-ая картинка по умолчанию
  end;
  for i := 0 to 10 do
  begin
    I_BMP[i] := TBitmap.Create;
    with I_BMP[i] do
    begin
      case i of
        0 : LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
        1 : LoadFromFile(ExpandConstant('{tmp}\2.bmp'));
//////////............................................


Заменить на картинки на формат *.PNG и привязать их к свободной форме Parent := WizardForm;

Другими словами TBitmapImage можно чем либо заменить? Или другой подход реализовать... через dll какой нибудь?

Tco 03 06-12-2013 17:23 2268127

Johny777,
Цитата:

Цитата Johny777
код будет очень нескоро. Паси форум »

Я его почти каждый день просматриваю (правда через E-Mail) :)
Цитата:

Цитата Johny777
вычисляется статистически. Учитывая прошедшее время и тд. Типа как здесь оставшееся время вычисляется. »

Чего-то у меня это не получается :(
Цитата:

Цитата Johny777
временно отменяется. пока готовь 2 ящика! »

:Beer:

Mat_y,
Цитата:

Цитата Mat_y
Заменить на картинки на формат *.PNG и привязать их к свободной форме Parent := WizardForm; »

Тут Вам поможет ботва!
Цитата:

Цитата Mat_y
Другими словами TBitmapImage можно чем либо заменить? Или другой подход реализовать... через dll какой нибудь? »

Незнаю, что конкретно Вам нужно... Типа вроде этого?



Если да, то вот готовый пример:

Shkutu 06-12-2013 17:34 2268143

И еще вопрос.
Можно ли в инно как-то менять кодировку текста, сохраняемого в файлик? При сохранении получается utf-8 (у меня юникодная версия), а надо в результате ucs-2 little endian

Dimas2011 06-12-2013 18:32 2268185

Вложений: 1
Ребята помогите не показывает картинку.я пытаюсь сделать так что когда выбираешь куда устанавливать файлы потом открывается сам список того что хочешь установить. так чтобы когда наводишь на название какого-то файла выскакивала картинка а оно не работает.Файл 107703

FX-DENIS 06-12-2013 21:00 2268265

Вложений: 1
Ребята я наверно многим тут уже надоел,но вроде все делаю правильно.Скрипт компилируется без ошибок и запускается в инно (расширенная версия юникод) когда нажимаешь на запуск инсталятора в инно(зеленая стрелка).Как только компилирую,закрываю инно,нажимаю Setup.exe , появляется на панели задач иконка и окно иснталла и не раскрывается,тупо зависает инсталл не появившись.Не пойму почему такой глюк.Ошибок при компиляции не выдает.Система свежая тока недавно ставил,временные папки и реестр чистил.Вот скрипт,может просмотрите глазом ,что не так.Подозреваю ,что то в procedure InitializeWizard();
Файл 107705

Gnom_aka_Lexander 06-12-2013 21:18 2268268

FX-DENIS, вот это все:
Код:

Source: ISSkin.dll; Flags: dontcopy
Source: tiger.cjstyles; Flags: dontcopy
//Source: ISDone.dll; DestDir: {tmp}; Flags: dontcopy
//Source: ISDone_Arc.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\InnoCallback.dll;  Flags: dontcopy
Source: CallbackCtrl.dll; Flags: dontcopy
Source: logo.bmp; Flags: dontcopy

подними в начало секции, а строчку с файлами игры (у тебя эта:
Код:

Source: D:\Games\R.G. Catalyst\Far Cry 3\*; DestDir: {app}; AfterInstall: Progress; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname
) наоборот в самый низ секции файлов

El Sanchez 06-12-2013 21:57 2268282

Цитата:

Цитата Shkutu
А нет ли у кого-нибудь случаем алгоритма кодирования в/декодирования base64 для инно? »

Shkutu, держите, делал когда-то для одного товарища:
читать дальше »

Код:

#define A = (Defined UNICODE) ? "W" : "A"

const
   
CRYPT_STRING_BASE64 = $1;
    IS_TEXT_UNICODE_STATISTICS = $2;
 
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: String; cbMultiByte: Integer; lpWideCharStr: String; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: String; cchWideChar: Integer; lpMultiByteStr: String; cbMultiByte, lpDefaultChar: Integer; lpUsedDefaultChar: Longint): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall';
function CryptBinaryToString(pbBinary: Longint; cbBinary, dwFlags: DWORD; pszString: Longint; var pcchString: DWORD): BOOL; external 'CryptBinaryToString{#A}@crypt32.dll stdcall';
function CryptStringToBinary(szString: String; cchString, dwFlags: DWORD; pbBinary: Longint; var pcbBinary, pdwSkip, pdwFlags: DWORD): BOOL; external 'CryptStringToBinary{#A}@crypt32.dll stdcall';
function IsTextUnicode(const lpv: String; iSize: Integer; var lpiResult: Integer): BOOL; external 'IsTextUnicode@advapi32.dll stdcall';

/////////////////////////////////////////////////////////////////////////////////////////////////////
function Base64Encode(const szString: String; const dwFlags: DWORD; const bUnicode: Boolean): String;
var
   
cchString: DWORD;
    pszString, pszResult: Longint;
    iLength: Integer;
#ifdef UNICODE
   
szAnsiString: AnsiString;
#endif
begin
    if
Length(szString) = 0 then Exit;
    iLength := Length(szString);
    if bUnicode then
    begin
       
iLength := iLength shl 1;
    #ifndef UNICODE
       
SetLength(Result, iLength);
        MultiByteToWideChar(0, 1, szString, -1, Result, Length(Result));
        szString := Result;
    #endif
       
pszString := CastStringToInteger(szString);
    end else begin
   
#ifdef UNICODE
       
szAnsiString := szString;
        pszString := CastAnsiStringToInteger(szAnsiString);
    #else
       
pszString := CastStringToInteger(szString);
    #endif
   
end;
    if not CryptBinaryToString(pszString, iLength, dwFlags, 0, cchString) then Exit;
    Result := StringOfChar(#0, cchString-1);
    pszResult := CastStringToInteger(Result);
    CryptBinaryToString(pszString, iLength, dwFlags, pszResult, cchString);
end;

////////////////////////////////////////////////////////////////////////////
function Base64Decode(const szString: String; const dwFlags: DWORD): String;
var
   
cchString, dwSkip: DWORD;
    pszResult, iResult: Longint;
    szBuffer: String;
begin
    if
Length(szString) = 0 then Exit;
    if not CryptStringToBinary(szString, Length(szString), dwFlags, 0, cchString, dwSkip, dwFlags) then Exit;
    Result := StringOfChar(#0, cchString);
    pszResult := CastStringToInteger(Result);
    CryptStringToBinary(szString, Length(szString), dwFlags, pszResult, cchString, dwSkip, dwFlags);
    szBuffer := Result;
    iResult := IS_TEXT_UNICODE_STATISTICS;
    if IsTextUnicode(Result, cchString, iResult) then
    begin
   
#ifndef UNICODE
       
SetLength(Result, Length(Result) shr 1);
        WideCharToMultiByte(0, 0, szBuffer, -1, Result, Length(Result), 0, 0);
    end;
    #else
       
Result := CastIntegerToString(pszResult);
    end else Result := CastIntegerToAnsiString(pszResult);
    #endif
end;

/////////////////////////////
procedure InitializeWizard();
begin
   
MsgBox(Format('Исходная строка: %s'#13#10'Кодированная строка (ANSI): %s', ['test1', Base64Encode('test1', CRYPT_STRING_BASE64, False)]), mbInformation, MB_OK);
    MsgBox(Format('Исходная строка: %s'#13#10'Кодированная строка (Unicode): %s', ['test1', Base64Encode('test1', CRYPT_STRING_BASE64, True)]), mbInformation, MB_OK);
    MsgBox(Format('Исходная строка (ANSI): %s'#13#10'Декодированная строка: %s', ['dGVzdDE=', Base64Decode('dGVzdDE=', CRYPT_STRING_BASE64)]), mbInformation, MB_OK);
    MsgBox(Format('Исходная строка (Unicode): %s'#13#10'Декодированная строка: %s', ['dABlAHMAdAAxAA==', Base64Decode('dABlAHMAdAAxAA==', CRYPT_STRING_BASE64)]), mbInformation, MB_OK);
end;


FX-DENIS 06-12-2013 23:18 2268312

Цитата:

Цитата Gnom_aka_Lexander
наоборот в самый низ секции файлов »

Спасибо завтра проверю,не думал,что последовательность в секции Files так жестко влияет на итог,даже в справке по моему не упоминается.Так же спасибо за ваши сборки Инно Ультра,только ей и пользуюсь,правда она устарела,вышли новые версии инно и dll,но я просто копирую в вашу папку куда установлена ультра с заменой(надеюсь так и нужно).Еще раз спасибо вам.

Gnom_aka_Lexander 07-12-2013 09:56 2268401

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

Dimas2011 07-12-2013 21:20 2268712

Цитата:

Цитата Dimas2011
Ребята помогите не показывает картинку.я пытаюсь сделать так что когда выбираешь куда устанавливать файлы потом открывается сам список того что хочешь установить. так чтобы когда наводишь на название какого-то файла выскакивала картинка а оно не работает.Test.rar »

помогите

Johny777 08-12-2013 00:01 2268796

Dimas2011, впиши InitInfo(); в InitializeWizard();
ты используешь этот код: http://forum.oszone.net/post-2169372-662.html
Он был недавно обновлён, я исправил в нём ошибку и оптимизировал.
замени у себя старую его версию на новую

PS:
и на будущее: будь добр выкладывать скрипт с файлами, чтоб перед тем как искать ошибку ни мне ни другим не приходилось закомментировать участки кода и/или искать нужные файлы
в твоём случае например это были
читать дальше »

Source: Files\A.bmp; Flags: dontcopy nocompression
Source: Files\B.bmp; Flags: dontcopy nocompression
Source: Files\C.bmp; Flags: dontcopy nocompression
Source: Files\D.bmp; Flags: dontcopy nocompression
Source: Files\logo.bmp; Flags: dontcopy
Source: Files\BASS.dll; Flags: dontcopy
Source: Files\sound.mp3; Flags: dontcopy nocompression
Source: Files\MusicButton.bmp; Flags: dontcopy
Source: Files\DirBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy
Source: Files\GroupBitmap.bmp; DestDir: "{tmp}"; Flags: dontcopy

Mat_y 08-12-2013 14:13 2268978

Johny777, в коде, который Вы привели в качестве примера (кстати еще раз спасибо)... за что отвечает эта часть? Можно получить коментарии к строкам, если не затруднит?
Код:

procedure CompOnClick(Sender: TObject);
var
  i, k: Integer;
begin
  k:= -1;
for i:= 0 to 3 do begin
if WizardForm.ComponentsList.Checked[1+i] then
begin
  k:= i;
  Break;
end;
end;
if (k=-1)or(cur=k) then Exit;
  ImgSetVisibility(png[cur], False);
  ImgSetVisibility(png[k], True);
  cur:= k;
  ImgApplyChanges(WizardForm.SelectComponentsPage.Handle);
end;

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

Optitron 08-12-2013 16:16 2269017

Здравствуйте. как сделать так, чтобы "DefaultDirName" для каждого компонента был разный? Например для компонента "One" "DefaultDirName={pf}\Game One", а для "Two" соответственно "DefaultDirName={pf}\Game Two"

Farser21 08-12-2013 19:51 2269077

Всем привет, вопрос такой.
В стандартном установщике, когда идет странице выбора компонентов, очень маленькое окно, подскажите как его сделать больше? Чтобы е нужно было постоянно прокручивать бегуной.

Dimas2011 08-12-2013 20:33 2269093

Цитата:

Цитата Johny777
Он был недавно обновлён, я исправил в нём ошибку и оптимизировал.
замени у себя старую его версию на новую »

а можно сылку на обновленый??

Nordek 09-12-2013 03:45 2269181

Цитата:

Цитата Dimas2011
а можно сылку на обновленый?? »

Так Johny777 в своём сообщении указал ссылку. Что тебе ещё? Персонально указать? Сообщение: 662. И посмотри там чуть ниже написано "Последний раз редактировалось Johny777, 05-12-2013 в 23:26.", наверно не трудно догадаться что к чему.

Mat_y 09-12-2013 09:26 2269215

Ребят... а реально ли в установщике сделать галку .."Установить обои на рабочий стол" с соответствующим функционалом?

Shkutu 09-12-2013 12:13 2269273

El Sanchez, спасибо.)
А на счет смены кодировки при сохранении текста в файл никто не подскажет?

Farser21 09-12-2013 14:24 2269330

Всем привет, вопрос такой.
В стандартном установщике, когда идет странице выбора компонентов, очень маленькое окно, подскажите как его сделать больше? Чтобы е нужно было постоянно прокручивать бегуной.

Mat_y 09-12-2013 16:13 2269389

Цитата:

Цитата Farser21
В стандартном установщике, когда идет странице выбора компонентов, очень маленькое окно, подскажите как его сделать больше? Чтобы е нужно было постоянно прокручивать бегуной »

Можете настроить это окно как душе угодно.

Код:

ComponentsList := TLabel.Create(WizardForm);
with ComponentsList do begin
    WizardForm.ComponentsList.Left:= ScaleX(30)///положение панели
    WizardForm.ComponentsList.Top:= ScaleY(100);
    WizardForm.ComponentsList.Width:= ScaleX(400)///размер панели
    WizardForm.ComponentsList.Height:= ScaleY(220)
    WizardForm.ComponentsList.Color:= $272727;///цвет фона в панели страници компонентов
    WizardForm.ComponentsList.Font.Color:= ClWhite;///цвет текста в панели страници компонентов
    WizardForm.ComponentsList.Font.Style:= [fsBold];
    WizardForm.ComponentsList.Font.Size:= 8;
    WizardForm.ComponentsList.Font.Name:= 'Arial'
    WizardForm.ComponentsList.Parent:= WizardForm.SelectComponentsPage;
    WizardForm.SelectComponentsPage;
  end;


Nordek 09-12-2013 16:38 2269416

Farser21
Farser21, Ну что ты копипастишь одно и тоже? Если не ответили, то это не значит что пропустили или не заметили твоё сообщение. Просто гуру-кодеры пока в спячке.

Farser21,
Открой "Inno Setup Compiler".
Перейди во вкладку "WizardForm Desinger (Дизайнер диалогов)":

и меняй как тебе вздумается.
Только начинай с чистого скрипта, чтоб не запоганить ранее созданный.
С левого бока, выбираешь желаемый диалог который хочешь отредактировать.
Кликаешь на объект. Затем можешь расширить этот объект ухватив за край и/или передвинуть объект.
Если нужно передвинуть например сразу три кнопки. То зажимаешь SHIFT, выбираешь эти три кнопки затем отпускаешь SHIFT и перемещаешь.
Так же вверху есть панель, с помощью которой можешь добавить кнопку, прогрессбар и пр.
Например некоторые объекты не меняются. Как скажем "InnerNotebook" и "OuterNotebook", их нужно выбирать вручную (с правого бока):

как выбрал один из них. Переходишь к диалогу, ухватываешь за край и расширяешь.

Цитата:

Цитата Farser21
очень маленькое окно, подскажите как его сделать больше? »

Скорее всего тебя интересует "InnerNotebook".
Только будь готов к тому что, придётся увеличивать размер окна и изменять все формы.

Farser21 09-12-2013 18:41 2269489

Mat_y, Nordek спасибо. Только куда вставлять этот код?
читать дальше »
ComponentsList := TLabel.Create(WizardForm);
with ComponentsList do begin
WizardForm.ComponentsList.Left:= ScaleX(30)///положение панели
WizardForm.ComponentsList.Top:= ScaleY(100);
WizardForm.ComponentsList.Width:= ScaleX(400)///размер панели
WizardForm.ComponentsList.Height:= ScaleY(220)
WizardForm.ComponentsList.Color:= $272727;///цвет фона в панели страници компонентов
WizardForm.ComponentsList.Font.Color:= ClWhite;///цвет текста в панели страници компонентов
WizardForm.ComponentsList.Font.Style:= [fsBold];
WizardForm.ComponentsList.Font.Size:= 8;
WizardForm.ComponentsList.Font.Name:= 'Arial'
WizardForm.ComponentsList.Parent:= WizardForm.SelectComponentsPage;
WizardForm.SelectComponentsPage;
end;

Tco 03 09-12-2013 18:54 2269495

Цитата:

Цитата Farser21
Только куда вставлять этот код? »

В любое место процедуры InitializeWizard
Достаточно просто:

procedure InitializeWizard();
begin
WizardForm.ComponentsList.SetBounds(ScaleX(30), ScaleY(100), ScaleX(400), ScaleY(220));
end;

Nordek 09-12-2013 19:36 2269516

Farser21, Вот пример инсталла набросал:
читать дальше »
Код:

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

[Tasks]
Name: a; Description: a
Name: b; Description: b
Name: c; Description: c
Name: d; Description: d
Name: e; Description: e

[Components]
Name: a; Description: a
Name: b; Description: b
Name: c; Description: c
Name: d; Description: d
Name: e; Description: e

[Code]
procedure InitializeWizard();
begin
  with
WizardForm do
  begin
   
ClientHeight := ScaleY(434);
    ClientWidth := ScaleX(609);
  end;

  with WizardForm.Bevel do
  begin
   
Top := ScaleY(393);
    Width := ScaleX(610);
  end;

  with WizardForm.CancelButton do
  begin
   
Left := ScaleX(516);
    Top := ScaleY(399);
  end;

  with WizardForm.NextButton do
  begin
   
Left := ScaleX(431);
    Top := ScaleY(399);
  end;

  with WizardForm.BackButton do
  begin
   
Left := ScaleX(355);
    Top := ScaleY(399);
  end;

  with WizardForm.OuterNotebook do
  begin
   
Width := ScaleX(609);
    Height := ScaleY(393);
  end;

  with WizardForm.WizardBitmapImage do
  begin
   
Height := ScaleY(393);
  end;

  with WizardForm.WelcomeLabel2 do
  begin
   
Width := ScaleX(429);
  end;

  with WizardForm.WelcomeLabel1 do
  begin
   
Width := ScaleX(429);
  end;

  with WizardForm.Bevel1 do
  begin
   
Width := ScaleX(610);
  end;

  with WizardForm.InnerNotebook do
  begin
   
Width := ScaleX(529);
    Height := ScaleY(317);
  end;

  with WizardForm.LicenseNotAcceptedRadio do
  begin
   
Top := ScaleY(280);
  end;

  with WizardForm.LicenseAcceptedRadio do
  begin
   
Top := ScaleY(260);
  end;

  with WizardForm.LicenseMemo do
  begin
   
Width := ScaleX(529);
    Height := ScaleY(220);
  end;

  with WizardForm.InfoBeforeMemo do
  begin
   
Width := ScaleX(529);
    Height := ScaleY(277);
  end;

  with WizardForm.DiskSpaceLabel do
  begin
   
Top := ScaleY(304);
  end;

  with WizardForm.ComponentsDiskSpaceLabel do
  begin
   
Top := ScaleY(304);
  end;

  with WizardForm.ComponentsList do
  begin
   
Width := ScaleX(528);
    Height := ScaleY(208);
  end;

  with WizardForm.TypesCombo do
  begin
   
Width := ScaleX(528);
  end;

  with WizardForm.NoIconsCheck do
  begin
   
Top := ScaleY(303);
  end;

  with WizardForm.TasksList do
  begin
   
Width := ScaleX(528);
    Height := ScaleY(260);
  end;

  with WizardForm.ReadyMemo do
  begin
   
Width := ScaleX(529);
    Height := ScaleY(277);
  end;

  with WizardForm.PreparingMemo do
  begin
   
Width := ScaleX(481);
    Height := ScaleY(193);
  end;

  with WizardForm.FilenameLabel do
  begin
   
Width := ScaleX(528);
  end;

  with WizardForm.ProgressGauge do
  begin
   
Width := ScaleX(528);
  end;

  with WizardForm.InfoAfterMemo do
  begin
   
Width := ScaleX(528);
    Height := ScaleY(277);
  end;

  with WizardForm.MainPanel do
  begin
   
Width := ScaleX(609);
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
   
Left := ScaleX(552);
  end;

  with WizardForm.WizardBitmapImage2 do
  begin
   
Height := ScaleY(393);
  end;

  with WizardForm.RunList do
  begin
   
Width := ScaleX(413);
    Height := ScaleY(227);
  end;

  with WizardForm.FinishedLabel do
  begin
   
Width := ScaleX(421);
  end;

  with WizardForm.FinishedHeadingLabel do
  begin
   
Width := ScaleX(421);
  end;
end;


nik1967 09-12-2013 23:34 2269695

Вложений: 1
Цитата:

Цитата El Sanchez
Ну раз обещал, последняя моя версия: »

Спасибо большое за скрипт закачки! Пара вопросов - можно ли как то изменить МБ на MB при переключении на другую локаль? Всё остальное решаемо с помощью [CustomMessages].
И да, ещё - если кликнуть и удерживать л.к.м. на верхней части инсталлятора (так сказать, поставить на паузу) - инсталлятор зависает :(.
А, нет - ещё и сек на sec в строке прошло (Elapsed).

habib2302 10-12-2013 09:54 2269826

доброе время суток.как добавить 2-ой путь в скрипт для удаления настроек/сохранений
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
 begin
 case CurUninstallStep of
 usPostUninstall:
 if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения') then
 begin
 if MsgBoxEx(0, 'Удалить сохранения игры находящиеся по адресу:' + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения'), 'Удаление сохранений', $00000004 or $00000020, 0, 0) = IDYES then
 DelTree(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения', True, True, True);
 end;
 end;
 end;


El Sanchez 10-12-2013 13:57 2269975

Цитата:

Цитата nik1967
Пара вопросов - можно ли как то изменить МБ на MB при переключении на другую локаль? »

nik1967, строка с размером и единицей измерения формируется функцией StrFormatByteSize64, а та берет надписи из строковых ресурсов shlwapi.dll. То же самое и с StrFromTimeInterval. Поэтому, если нужен полный контроль над отображением информации о размерах/времени, то нужно свои функции писать TicksToTime/BytesToSize.
Цитата:

Цитата nik1967
И да, ещё - если кликнуть и удерживать л.к.м. на верхней части инсталлятора (так сказать, поставить на паузу) - инсталлятор зависает »

Ну, правильно, инсталлятор однопоточное приложение, пока обрабатываются мышиные сообщения головной поток ждет. Выносил я как-то закачку в отдельный поток, нестабильно все как-то, на XP работает, на Win7 нет, ошибки всякие вылазят. Будет время доделаю.
Цитата:

Цитата habib2302
как добавить 2-ой путь в скрипт для удаления настроек/сохранений »

habib2302, таким же способом, как и 1-й.

habib2302 10-12-2013 15:32 2270030

Цитата:

Цитата El Sanchez
таким же способом, как и 1-й. »

это как?

Tco 03 10-12-2013 16:26 2270083

habib2302,
По мойму очевидней некуда! Так же как и первый...
читать дальше »

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usPostUninstall:
if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения') then
begin
if MsgBoxEx(0, 'Удалить сохранения игры находящиеся по адресу:' + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения'), 'Удаление сохранений', $00000004 or $00000020, 0, 0) = IDYES then
DelTree(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения', True, True, True);

if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения 2') then
begin
if MsgBoxEx(0, 'Удалить сохранения игры находящиеся по адресу:' + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения 2'), 'Удаление сохранений', $00000004 or $00000020, 0, 0) = IDYES then
DelTree(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры\The Saboteur™\Сохранения 2', True, True, True);
end;

end;
end;
end;

Farser21 10-12-2013 16:28 2270086

Ребята всем доброго времени суток. Кто может помочь, возникли небольшие вопросы о установщике. Объяснить не смогу. Поэтому прошу связаться со мной по скайпу и я покажу с чем у меня проблемы, заранее спасибо! скайп farsero_o

Nordek 10-12-2013 16:40 2270104

Tco 03, А дальше что?
Ведь если папка "Сохранения 2" будет присутствовать а папка "Сохранения" не будет присутствовать, то смысла в таком коде нету т.е он даже не сработает. Учитывать нужно все нюансы.
Ну, продолжай, продолжай...

Tco 03 10-12-2013 18:12 2270159

Цитата:

Цитата Nordek
А дальше что? »

Чувак... Дальше двигаем извилинами :tease:
читать дальше »
Код:

[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]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
 usPostUninstall:
if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры') or DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Не мои игры') then
begin
if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры') then
if MsgBoxEx(0, 'Удалить сохранения игры находящиеся по адресу:' + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры'), 'Удаление сохранений', $00000004 or $00000020, 0, 0) = IDYES then
 DelTree(AddBackslash(ExpandConstant('{userdocs}')) + 'Мои игры', True, True, True);
 
if DirExists(AddBackslash(ExpandConstant('{userdocs}')) + 'Не мои игры') then
if MsgBoxEx(0, 'Удалить сохранения игры находящиеся по адресу:' + #13#13 + AddQuotes(AddBackslash(ExpandConstant('{userdocs}')) + 'Не мои игры'), 'Удаление сохранений', $00000004 or $00000020, 0, 0) = IDYES then
 DelTree(AddBackslash(ExpandConstant('{userdocs}')) + 'Не мои игры', True, True, True);
end;
end;
end;


nik1967 10-12-2013 18:15 2270165

Цитата:

Цитата El Sanchez
строка с размером и единицей измерения формируется функцией StrFormatByteSize64, а та берет надписи из строковых ресурсов shlwapi.dll. То же самое и с StrFromTimeInterval. Поэтому, если нужен полный контроль над отображением информации о размерах/времени, то нужно свои функции писать TicksToTime/BytesToSize. »

С функциями то понятно, разобрался откуда что растёт, а вот самому написать функции "если нужен полный контроль над отображением информации о размерах/времени" ума не хватает. Это очень сложно и времязатратно? Был бы очень признателен (да и думаю не один я), если бы ты выбрал время и написал эти функции.

Nordek 10-12-2013 18:30 2270180

Tco 03
Tco 03, Другое дело. А то на словах "
Цитата:

Цитата Tco 03
По мойму очевидней некуда! »

" все мастера.

Цитата:

Цитата Tco 03
Дальше нужно двигать извилинами »

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

Цитата:

Цитата Tco 03
Дальше нужно двигать извилинами »

Возвращаю шайбу: Знание "Русского языка" тоже нужно.

habib2302 10-12-2013 18:49 2270193

Tco 03, выдает ошибку

Tco 03 10-12-2013 19:25 2270208

habib2302,
Во первых: usUninstall - это то, что нужно выполнить перед деинсталяцией. usPostUninstall - после.
Во вторых у тебя уже есть:
case CurUninstallStep of
usPostUninstall:
зачем тебе: CurUninstallStep = usUninstall

Код полностью рабочий, проверь просто так, без ничего. А в своём скрипте разберайся сам. И не суй всё куда попало.

habib2302 10-12-2013 19:36 2270217

Tco 03, :lamer:

Nordek 10-12-2013 20:17 2270242

Цитата:

Цитата habib2302
выдает ошибку »

Потому что участок кода:
Код:

    if (CurUninstallStep=usUninstall) then
      begin
       
GDFBinary:=ExpandConstant('{#GDFBinary}');
        RetrieveGUIDForApplication(GDFBinary, GUID);
        RemoveFromGameExplorer(GUID);
        UnloadDll(ExpandConstant('{app}\GameuxInstallHelper.dll'));
      end;

в воздухе висит и не относится к процедуре "procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
".

Заведи нижний участок кода за end; кода который находится выше.

Dimas2011 10-12-2013 21:02 2270281

Ребята помогите не показывает картинку.я пытаюсь сделать так что когда выбираешь куда устанавливать файлы потом открывается сам список того что хочешь установить. так чтобы когда наводишь на название какого-то файла выскакивала картинка а оно не работает.Скрип обновлённый вставил и не работает http://rghost.ru/50868040

Farser21 10-12-2013 21:08 2270284

Так как никто не ответил повторяю вопрос. Кто может помочь, возникли небольшие вопросы о установщике. Объяснить не смогу. Поэтому прошу связаться со мной по скайпу и я покажу с чем у меня проблемы, заранее спасибо! скайп farsero_o

Помогите пожалуйста, это очень важно!

habib2302 10-12-2013 21:18 2270290

Nordek,

Nordek 10-12-2013 21:48 2270312

habib2302, Это называется ты "не корректно в первый раз совместил".
Я не знаю как ты вставлял его. Ты же ведь в первый раз наверно перемещал в код?

А там скорее всего удалил
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var GDFBinary: String; GUID: TGUID;
begin

end
;

где был var GDFBinary: String; GUID: TGUID;


так вот, теперь у себя под процедуру procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);


подсунь
Код:

var GDFBinary: String; GUID: TGUID;

.

P.S Я у экстрасенсов уроков мастерства не брал, по этому нет у меня экстрасенсорных способностей.

Nordek 11-12-2013 02:18 2270453

Вложений: 1
Цитата:

Цитата Dimas2011
Ребята помогите не показывает картинку »

Прикрепил скрипт.

Farser21 11-12-2013 14:40 2270635

Всем привет, возникли такие вопросы.
1) Когда наводишь на компонент, то выскакивает картинка, как задать определенные координаты картинке? Задумка сделать все картинки одного размера, и чтобы они выскакивали в одном месте.
2) Как сделать чтобы при установке компонентов, очищалось старое содержимое того места куда устанавливаешь, и место него устанавливалось новое.
3) Как сделать авто определение установки, т.е. установщик сам выбирает нужную папку куда устанавливать. Например мне нужно чтобы компоненты устанавливались в папку с танками, в оригинале она называется World of Tanks. Как сделать так чтобы компоненты можно было установить в папку у которой в названии присутствовало World of Tanks, и возможно сделать так, чтобы установщик автоматом находил нужную папку.
4) Когда устанавливаешь компоненты то инсталка появляется в основной папке, как сделать чтобы инсталка создавалась в отдельной папке, и можно было самому задать название.
5) И последний вопрос который частично связан с первым. Идея такова если подогнать картинки под один размер и под одни координаты то картинки будут появляться в одном месте, но далее если отводишь курсор от компонента то они пропадают. Как сделать так чтобы изначально в том месте где должно быть картинки стояла стандартная картинка, а далее при наведении там бы появлялась картинка компонента.

Заранее спасибо, всем кто сможет помочь. Для меня это очень важно, поэтому прошу мне помочь!

Optitron 11-12-2013 15:35 2270677

Здравствуйте. как сделать так, чтобы "DefaultDirName" для каждого компонента был разный? Например для компонента "One" "DefaultDirName={pf}\Game One", а для "Two" соответственно "DefaultDirName={pf}\Game Two"

FX-DENIS 11-12-2013 15:38 2270679

Цитата:

Цитата Farser21
2) Как сделать чтобы при установке компонентов, очищалось старое содержимое того места куда устанавливаешь, и место него устанавливалось новое. »

читать дальше »
Эти секции отвечают за удаление файлов и/или папок перед установкой ([InstallDelete]) или при удалении ([UninstallDelete]) приложения.

Задача: перед установкой обновления для установленной программы удалить в папке приложения (путь к которой укажет пользователь при установке приложения) директорию и все ее содержимое (подпапки и файлы), и создать папку с тем же именем, куда установить все файлы обновления.
Решение:

…………………………
;Перед установкой удалить в папке приложения папку Data со всем ее содержимым
[InstallDelete]
Type: filesandordirs; Name: "{app}\Data"
;Создать папку с тем же именем, что и удаленная (хотя создавать ее не обязательно – инсталлятор все равно ее создаст при выполнении секции [Files]
[Dirs]
Name: "{app}\Data"

;Установить в созданную папку файлы
[Files]
Source: "C:\Program1.exe"; DestDir: "{app}\Data"
Source: "C:\Program2.exe"; DestDir: "{app}\Data"
Source: "C:\ReadMe.txt"; DestDir: "{app}\Data"; Flags: isreadme

;При удалении приложения удалить созданную папку
[UninstallDelete]
Type: filesandordirs; Name: "{app}\Data"
…………………………

Эту же задачу можно решить с помощью секции [Code]:

Код:

[Files]
Source: "C:\Program1.exe"; DestDir: "{app}\Data"; BeforeInstall: MyBeforeInstall
Source: "C:\Program2.exe"; DestDir: "{app}\Data";
Source: "C:\ReadMe.txt"; DestDir: "{app}\Data"; Flags: isreadme

[UninstallDelete]
Type: filesandordirs; Name: "{app}\Data"
 
[Code]
{Создать процедуру, которую инсталлятор вызовет перед установкой файла Program1.exe}
Procedure MyBeforeInstall;
Begin
{Если в директории программы существует папка Data, она удаляется со всеми вложенными в нее файлами и папками}
 if DirExists(ExpandConstant('{app}\Data')) then
  DelTree(ExpandConstant('{app}\Data'), True, True, True);
end;
…………………………



Цитата:

Цитата Farser21
3) Как сделать авто определение установки, т.е. установщик сам выбирает нужную папку куда устанавливать. »

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

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={code:GetInstallDir}
AppendDefaultDirName=no

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

[Code]
Function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Rockstar Games\EFLC', 'InstallPath', Path);//Какой ключ реестра ищет ...
Result := Path;
end;

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Rockstar Games\EFLC') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! Укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;


Farser21 11-12-2013 15:57 2270692

FX-DENIS , Спасибо!

FX-DENIS 11-12-2013 15:59 2270694

Цитата:

Цитата Optitron
"DefaultDirName" для каждого компонента был разный? »

По моему страниц 10 назад уже был ответ.Пролистайте странички.

Farser21 11-12-2013 16:36 2270724

FX-DENIS , Возникли проблемы с авто определением установки. Получается я вставил то что ты скинул, но когда запускается установщик пишет Название установщика "World of Tanks" и пишет что не может найти. Где я мог допустить ошибку?

El Sanchez 11-12-2013 16:43 2270729

Цитата:

Цитата nik1967
а вот самому написать функции "если нужен полный контроль над отображением информации о размерах/времени" ума не хватает. »

nik1967, открываешь любой репак, там этих реализаций... Вот мой вариант:
читать дальше »

Код:

[Setup]
AppName=test
AppVerName=test
CreateAppDir=no
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no

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

[CustomMessages]
ru.Size=байт,КБ,МБ,ГБ,ТБ,ПБ
en.Size=bytes,KB,MB,GB,TB,PB
ru.Time=сек,мин,ч
en.Time=s,m,h

[code]
function pow(x, y: Double): Double; external 'pow@ntdll.dll stdcall';

///////////////////////////////////////////////////
function BytesToSize(const dBytes: Double): String;
var
   
i, j: Integer;
    dRange: Double;
begin
    with
TStringList.Create do
    try
       
CommaText := CustomMessage('Size');
        if Count = 0 then Exit;

        // default
       
Result := Format('0 %s', [Strings[0]]);
        if dBytes = 0 then Exit;

        // convert
       
for i := Count downto 0 do
        begin
           
dRange := pow(1024, i);
            if dBytes < dRange then Continue;
            if Abs(dBytes/dRange - Round(dBytes/dRange)) < 0.01 then Result := Format('%.n %s', [dBytes/dRange, Strings[i]]) else Result := Format('%n %s', [dBytes/dRange, Strings[i]]);
            Break;
        end;
    except
       
RaiseLastException;
    finally
       
Free;
    end;
end;

///////////////////////////////////////////////////
function TicksToTime(const dwTicks: DWORD): String;
var
   
i, j: Integer;
    dwRange: DWORD;
begin
    with
TStringList.Create do
    try
       
CommaText := CustomMessage('Time');
        if Count = 0 then Exit;

        // default
       
if dwTicks < 1000 then
        begin
           
Result := Format('0 %s', [Strings[0]]);
            Exit;
        end;
       
        // convert
       
dwTicks := Round(double(dwTicks)/1000);
        for i := Count-1 downto 0 do
        begin
           
dwRange := 1;
            for j := 1 to i do dwRange := dwRange*60;
            if dwTicks > dwRange-1 then
            begin
               
Result := Format('%s%d %s ', [Result, dwTicks div dwRange, Strings[i]]);
                dwTicks := dwTicks - (dwTicks div dwRange)*dwRange;
            end;
        end;
    except
       
RaiseLastException;
    finally
       
Result := TrimRight(Result);
        Free;
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
   
MsgBox(BytesToSize(MaxInt), mbInformation, MB_OK);
    MsgBox(TicksToTime(MaxInt), mbInformation, MB_OK);
end;


Nordek 11-12-2013 16:44 2270730

Цитата:

Цитата Farser21
Получается я вставил то что ты скинул »

Вот молодец. А остальное FX-DENIS должен угадать за тебя, да?

Farser21, Тупо скопипастилл и всё?
А в :
Код:

RegQueryStringValue(HKLM, 'SOFTWARE\Rockstar Games\EFLC', 'InstallPath', Path);//Какой ключ реестра ищет ...

и
Код:

if not RegKeyExists(HKLM, 'SOFTWARE\Rockstar Games\EFLC') then

ничего не нужно указывать?

Вместо SOFTWARE\Rockstar Games\EFLC замени на свои. И если нет InstallPath, то смотри какое значение ведёт к папке.

Optitron 11-12-2013 17:36 2270782

FX-DENIS, Если вы про мой вопрос, то он был немного другого типа.

nik1967 11-12-2013 18:19 2270814

El Sanchez, спасибо! Затупил немного - ввели в заблуждение функции StrFormatByteSize64 и StrFromTimeInterval. Думал к ним нужно привязываться.

Farser21 11-12-2013 18:26 2270818

Nordek, спасибо

Tco 03 11-12-2013 18:31 2270823

El Sanchez, Здравствуйте. Ваш пример по загрузке файла, без сомнения, хорош. Пожалуйста, если Вас не затруднит, не могли бы Вы помочь с реализацией загрузки двух файлов. С одним общим прогрессбаром и текущим. Или же как эксперт помогите, пожалуйста, доработать пример товарища Johny777. Он в принципе рабочий, но не корректно отрабатывает свои действия. Буду премного благодарен, да и не только я. Очень нужная будет вещь!

Nordek 11-12-2013 18:42 2270836

FX-DENIS, Поправь пожалуйста сообщение. Не корректный вывод BB-Кодов.

Если в скрипте присутствует [Code], то понадобится дополнительная обработка.
Например: [*Code], [#Code], [Co[u][/u]de], [b][Co[/b][b]de][/b] и т.д.

Примеры с использованием возможной обработки:



Исходный текст BB-кодов:
[code][Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[*Code]
procedure InitializeWizard();
begin
with WizardForm.WizardSmallBitmapImage do
begin
Visible := False;
end;
end;[/code]

Вывод:
Код:

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

[*Code]
procedure InitializeWizard();
begin
  with WizardForm.WizardSmallBitmapImage do
  begin
    Visible := False;
  end;
end;



Исходный текст BB-кодов:
[code][Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[#Code]
procedure InitializeWizard();
begin
with WizardForm.WizardSmallBitmapImage do
begin
Visible := False;
end;
end;[/code]

Вывод:
Код:

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

[#Code]
procedure InitializeWizard();
begin
  with WizardForm.WizardSmallBitmapImage do
  begin
    Visible := False;
  end;
end;



Исходный текст BB-кодов:
[code][Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[b][Co[/b][b]de][/b]
procedure InitializeWizard();
begin
with WizardForm.WizardSmallBitmapImage do
begin
Visible := False;
end;
end;[/code]

Вывод:
Код:

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

[Code]
procedure InitializeWizard();
begin
  with WizardForm.WizardSmallBitmapImage do
  begin
    Visible := False;
  end;
end;



Исходный текст BB-кодов:
[code][Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Co[u][/u]de]
procedure InitializeWizard();
begin
with WizardForm.WizardSmallBitmapImage do
begin
Visible := False;
end;
end;[/code]

Вывод:
Код:

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

[Code]
procedure InitializeWizard();
begin
  with WizardForm.WizardSmallBitmapImage do
  begin
    Visible := False;
  end;
end;




Кроме всего прочего, есть ещё в самой Inno Setup Compiler возможность копирования текста с BB-кодами.
В Inno Setup Compiler есть пункт "Копировать как UBB код", который позволяет скопировать сразу с BB-кодами.
Правда в некоторых случаях копируется не корректно.

Shkutu 11-12-2013 19:21 2270862

Приветствую всех!
А кто-нибудь знает, может ли инно работать с wsdl? И если да, то нет ли какого-нибудь примера или где про это можно почитать?

Farser21 11-12-2013 19:26 2270866

Nordek, я указывал путь но все равно, не получается.
Место
Код:

RegQueryStringValue(HKLM, 'SOFTWARE\Rockstar Games\EFLC', 'InstallPath', Path);//Какой ключ реестра ищет ...
Я пишу так
Код:

RegQueryStringValue(HKLM, 'World_of_Tanks', 'InstallPath', Path);//Какой ключ реестра ищет ...
Что писать вместо InstallPath я не могу врубиться где взять значение которое ведет в папке.

В итоге когда я компилирую, то пишет что такой путь не найден, а вместо World_of_Tanks. Почему-то пишется что путь был My Program. И в итоге никакого автопределения нету

Nordek 11-12-2013 20:18 2270898

Цитата:

Цитата Farser21
Я пишу так »
Код:

RegQueryStringValue(HKLM, 'World_of_Tanks', 'InstallPath', Path);//Какой ключ реестра ищет ...

А точно
Код:

RegQueryStringValue(HKLM, 'World_of_Tanks', 'InstallPath', Path);//Какой ключ реестра ищет ...
???
Хочешь чтоб я угадал что находится у тебя в реестре?
Может так:
Код:

RegQueryStringValue(HKLM, 'SOFTWARE\World_of_Tanks', 'InstallPath', Path);//Какой ключ реестра ищет ...
или так:
Код:

RegQueryStringValue(HKLM, 'SOFTWARE\Компания_Игры\World_of_Tanks', 'InstallPath', Path);//Какой ключ реестра ищет ...

Ты залезь в regedit (Редактор реестра) да посмотри

в HKEY_LOCAL_MACHINE » SOFTWARE » Твоя_Игра

так же может находиться в HKEY_CURRENT_USER » SOFTWARE » Твоя_Игра.

Dimas2011 11-12-2013 20:36 2270906

Вложений: 1
Выдаёт ошибку что делать??Файл 107864

Nordek 11-12-2013 20:41 2270908

Цитата:

Цитата Dimas2011
Выдаёт ошибку что делать?? »

Исправить. У тебя 2 раза повторяется function InitializeSetup.

habib2302 12-12-2013 17:30 2271397

Nordek, просто я делаю репак одной проги и папка с настройками хранятся в разных местах в зависимости от винды
XP %USERPROFILE%\Local Settings\Application Data\
Vista/7 %USERPROFILE%\AppData\LocalLow\
может просто указать минимальную версию винды чтобы этот код работал?

Nordek 13-12-2013 08:07 2271665

habib2302
Цитата:

Цитата habib2302
XP %USERPROFILE%\Local Settings\Application Data\
Vista/7 %USERPROFILE%\AppData\LocalLow\ »

Переменная Windows %USERPROFILE% = константе Inno {%USERPROFILE}

XP
Код:

{%USERPROFILE}\Local Settings\Application Data\
Vista/7
Код:

{%USERPROFILE}\AppData\LocalLow\

Если
XP: "%USERPROFILE%\Local Settings\Application Data\"
а
Vista/7: "%USERPROFILE%\AppData\Local\"

то универсальная константа будет {localappdata}

habib2302 13-12-2013 12:04 2271741

Цитата:

Цитата Nordek
универсальная константа будет {localappdata} »

пути у этой константы XP \Local Settings\Application Data\
Vista/7 \AppData\Local\
Цитата:

Цитата Nordek
Ведь если папка "Сохранения 2" будет присутствовать а папка "Сохранения" не будет присутствовать, то смысла в таком коде нету т.е он даже не сработает. Учитывать нужно все нюансы.
Ну, продолжай, продолжай... »

ты все таки был прав

Dimas2011 13-12-2013 19:51 2271982

Вложений: 1
Что тут надо исправить??Файл 107947

habib2302 13-12-2013 20:08 2271992

Dimas2011, у тебя указан не полный путь
у тебя
Код:

HKLM, 'SOFTWARE\Wargaming.net\wot',
а нужно
Код:

HKLM, 'SOFTWARE\Wargaming.net\wot\Launcher',

Dimas2011 13-12-2013 21:30 2272031

Вложений: 1
Только теперь другая ошибка вылазееФайл 107959т

Nordek 13-12-2013 21:58 2272041

Цитата:

Цитата Dimas2011
Только теперь другая ошибка вылазее1111.pngт »

Эм, посмотри в HKEY_LOCAL_MACHINE.

Dimas2011 13-12-2013 22:09 2272051

Цитата:

Цитата Nordek
Цитата Dimas2011:
Только теперь другая ошибка вылазее1111.pngт »
Эм, посмотри в HKEY_LOCAL_MACHINE. »

не помогло

Nordek 13-12-2013 22:40 2272066

Цитата:

Цитата Dimas2011
не помогло »

Что значит не помогло?
Вариант 1
Открой Редактор реестра
В реестре, кликни Мой компьютер
Зажми комбинацию клавиш CTRL+F
Напротив Найти введи возможные названия:
World_of_Tanks
World of Tanks
wot

Сначала в поиске вводишь World_of_Tanks
Жмёшь Найти
а потом клавишей F3 фильтруй т.е F3 » F3 » F3 » F3 » F3 » F3
таким же способом и остальные.


Если совсем худо, то »
Вариант 2
Скачиваешь Revo Uninstaller (На сайте есть Portable версия)
Запускаешь Revo Uninstaller
Находишь игру, выбираешь
Кликаешь Правой кнопкой мыши и выбираешь Открыть ключ реестра
Откроется ключ, а далее инфу сюда.

Dimas2011 13-12-2013 23:59 2272122

Вложений: 1
Цитата:

Цитата Nordek
Цитата Dimas2011:
не помогло »
Что значит не помогло?
Вариант 1
Если совсем худо, то »
Вариант 2 »

ВОТ ИНФА Файл 107974

Nordek 14-12-2013 03:17 2272207

Цитата:

Цитата Dimas2011
ВОТ ИНФА »

Ну как-то так:
Вариант 1
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={code:GetInstallDir}
AppendDefaultDirName=no

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

[Code]
Function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path);//Какой ключ реестра ищет ...
Result := Path;
end;

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! Укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;

Вариант 2
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={code:GetInstallDir|{pf}\Альтернативный путь}
AppendDefaultDirName=no

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

[Code]
Function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path);//Какой ключ реестра ищет ...
Result := Path;
end;

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! '+#13#10+'Будет предложен альтернативный путь установки, либо укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;


habib2302 14-12-2013 12:35 2272294

и как сделать чтобы при выборе компонента "portable" были неактивными компоненты с ярлыками и были сняты с них галочки?
Код:

Name: icons; Description: {cm:AdditionalIcons}; Types: full;
Name: icons\desktop; Description: {cm:CreateDesktopIcon}; Types: full;
Name: icons\quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; OnlyBelowVersion: 0,6.1; Types: full;
Name: icons\quicklaunchicon7; Description: {cm:CreateQuickLaunchIcon}; MinVersion: 0,6.1; Types: full;


Dimas2011 14-12-2013 15:40 2272382

Вложений: 1
Цитата:

Цитата Nordek
Ну как-то так:
Вариант 1
Вариант 2 »

теперь другая ошибка Файл 107990

Raz3r 15-12-2013 16:23 2272690

Вложений: 1
Помогите плиз. Не могу поставить скин на инсталлер. Сделал всё по инструкции, но запускается всё-равно обычная версия setup.
Вот проект(если можно объясните, что вы изменили):

Nordek 15-12-2013 17:03 2272716

Цитата:

Цитата Raz3r
но запускается всё-равно обычная версия setup. »

Потому что у тебя код для ANSI версии Inno, а ты его на Юникодной версии Inno запускаешь. Если быть ещё точнее, то всё дело в dll:
ISSkin.dll - ANSI
ISSkinU.dll - Unicode

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

#define Skin "Concave_Dark"
#define MyAppName "Crysis Wars Ex"
#define MyAppVersion "1.1.4"
#define MyAppPublisher "OMG!"
#define MyAppURL "http://www.om-studios.com/"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppId={{007CE108-34A2-4013-935D-23EB4F1FA81D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={code:MyConst}
DirExistsWarning=no
DisableProgramGroupPage=yes
CreateUninstallRegKey=yes
WizardImageFile=C:\Users\Razor\Downloads\Wizard.bmp
WizardSmallImageFile=C:\Users\Razor\Downloads\2000.bmp
OutputBaseFilename=Ex Mod
SetupIconFile=C:\Users\Razor\Downloads\2000.ico
UninstallIconFile=C:\Program Files (x86)\Smart Install Maker\Icons\Uninstall\Uninstall-9.ico
Compression=lzma2
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

[Files]
Source: "D:\Проект Crysis\Mods\*"; DestDir: "{app}\Mods"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "ISSkin{#A}.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "compiler:IS_Skin\Styles\{#Skin}.cjstyles"; DestDir: "{tmp}"; Flags: dontcopy
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: "{commondesktop}\Crysis Wars EX 32bit"; Filename: "{code:MyConst}\Bin32\Crysis.exe"; Parameters: "/-MOD CrysisWars_EX"; Tasks: desktopicon
Name: "{commondesktop}\Crysis Wars EX 64bit"; Filename: "{code:MyConst}\Bin64\Crysis.exe"; Parameters: "/-MOD CrysisWars_EX"; Tasks: desktopicon

[Code]
// Процедуры работы со скинами
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:ISSkin{#A}.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:ISSkin{#A}.dll stdcall';

// Процедуры Вин-апи
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

// Настройка пути установки
function MyConst(Default: String): String;
var
ResultStr: String;
begin
  If
RegQueryStringValue(HKLM, 'SOFTWARE\Crytek\Crysis Wars', 'Install Dir', ResultStr) then
 
Result:=ResultStr
  else
 
Result:= ExpandConstant('{pf64}\Crysis Wars Ex');
end;

// Блокирование меню выбора пути установки
Procedure InitializeWizard();
begin
   
WizardForm.DirEdit.Enabled := False;
end;

// Загрузка скина инсталлятора
function InitializeSetup(): Boolean;
begin
 
ExtractTemporaryFile('{#Skin}.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\{#Skin}.cjstyles'), '');
  Result := True;
end;

procedure DeinitializeSetup();
begin
 
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
  UnloadSkin();
end;


Raz3r 15-12-2013 17:26 2272732

Nordek, а как сменить кодировку?

nik1967 15-12-2013 18:04 2272759

Raz3r, 2 варианта - либо использовать InnoSetup ANSI, либо использовать библиотеку ISSkin.dll для UNICODE

Nordek 15-12-2013 18:14 2272766

Вложений: 1
Raz3r, Добавил код в предыдущее сообщение.

Ниже прикрепил пример.
Я надеюсь сообразишь Dll-ки вставить.

habib2302 15-12-2013 18:37 2272784

ответьте пожалуйста на мой вопрос

Dimas2011 15-12-2013 18:57 2272810

Цитата:

Цитата Dimas2011
теперь другая ошибка Файл 107990
Изображения
444545.png
(38.4 Kb, 5 просмотров) »

помогитеФайл 108019

Nordek 15-12-2013 19:08 2272814

Цитата:

Цитата Dimas2011
помогитеФайл 108019 »

Твой Файл 108019 » "Страница не найдена. Если вы уверены, что использовали правильную ссылку, свяжитесь с администрацией"

Nordek 15-12-2013 19:58 2272836

Цитата:

Цитата habib2302
ответьте пожалуйста на »

Например так:
читать дальше »
Код:

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

[Icons]
Name: {commondesktop}\My Program PE; Filename: {app}; Tasks: a
Name: {commondesktop}\My Program NotPE; Filename: {app}; Tasks: b

[Components]
Name: pe; Description: Portable; Flags: exclusive
Name: notpe; Description: Не Portable; Flags: exclusive

[Tasks]
Name: a; Description: A; Components: pe
Name: b; Description: B; Components: notpe


Dimas2011 15-12-2013 20:15 2272854

Цитата:

Цитата Dimas2011
Цитата Dimas2011:
теперь другая ошибка Файл 107990
Изображения
444545.png
(38.4 Kb, 5 просмотров) »
помогитеФайл 108019 »

http://php-studia.ru/?s=444545.png

habib2302 15-12-2013 20:16 2272855

Nordek, у меня список ярлыков находится в компонентах
Код:

[Components]
Name: icons; Description: {cm:AdditionalIcons}; Types: full;
Name: icons\desktop; Description: {cm:CreateDesktopIcon}; Types: full;
Name: icons\quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; OnlyBelowVersion: 0,6.1; Types: full;
Name: icons\quicklaunchicon7; Description: {cm:CreateQuickLaunchIcon}; MinVersion: 0,6.1; Types: full;


Nordek 15-12-2013 23:14 2272942

habib2302,

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

[Code]
var
 
RadioButton1, RadioButton2: TNewRadioButton;
  CheckBox1: TNewCheckBox;

procedure ButtonClick(Sender: TObject);
begin
  case
TNewRadioButton(Sender) of
   
RadioButton1:
    begin
     
CheckBox1.Checked:= RadioButton1.Checked;
      CheckBox1.Enabled:= RadioButton1.Checked;
    end;
    RadioButton2:
    begin
     
CheckBox1.Enabled:= RadioButton1.Checked;
      CheckBox1.Checked:= RadioButton1.Checked;
    end;
  end;
end;


procedure InitializeWizard();
begin
 
RadioButton1 := TNewRadioButton.Create(WizardForm);
  with RadioButton1 do
  begin
   
Parent := WizardForm.ReadyPage;
    Left := ScaleX(32);
    Top := ScaleY(24);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Checked := True
    Caption := 'RadioButton1';
    OnClick := @ButtonClick;
  end;

  RadioButton2 := TNewRadioButton.Create(WizardForm);
  with RadioButton2 do
  begin
   
Parent := WizardForm.ReadyPage;
    Left := ScaleX(32);
    Top := ScaleY(56);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'RadioButton2';
    OnClick := @ButtonClick;
  end;

  CheckBox1 := TNewCheckBox.Create(WizardForm);
  with CheckBox1 do
  begin
   
Parent := WizardForm.ReadyPage;
    Left := ScaleX(32);
    Top := ScaleY(128);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Checked := True
    Caption := 'NewCheckBox1';
  end;
end;

Ну, это только пример. Надеюсь в остальном гуру-кодеры помогут.

habib2302 15-12-2013 23:27 2272952

вот
мой скрипт

Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "CrystalDiskInfo"
#define MyAppVersion "6.0.4"
#define MyAppPublisher "Copyright © 2008-2013 hiyohiyo. All rights reserved."
#define MyAppURL "http://crystalmark.info/"
#define MyAppExeName "DiskInfo.exe"
#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\CrystalDiskInfo
DefaultGroupName=CrystalDiskInfo
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion} RePack (& Portable) by Xabib
SetupIconFile=ico.ico
Compression=lzma/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=yes
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
;Производитель.
AppPublisher={#MyAppPublisher}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
AppModifyPath={app}
VersionInfoProductName={#MyAppName}
DirExistsWarning=no
AppendDefaultDirName=false
AppendDefaultGroupName=false
DisableReadyPage=true
AppID=CrystalDiskInfo
VersionInfoDescription={#MyAppName} RePack by Xabib
AppCopyright=Xabib © 2013
VersionInfoVersion={#MyAppVersion}
VersionInfoProductVersion={#MyAppVersion}
VersionInfoCopyright=Xabib © 2013
DisableFinishedPage=false
UninstallDisplayName={#MyAppName}
ComponentsListTVStyle=true
ShowComponentSizes=false
Uninstallable=not IsComponentSelected('CDI\Portable')

[Languages]
Name: "Russian"; MessagesFile: "Russian.isl"

[CustomMessages]
Russian.Msg1=Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?
Russian.MsgErorr=Удаление завершилось неудачей!

[Types]
Name: full; Description: Полная установка; Flags: iscustom

[Components]
Name: CDI; Description: {#MyAppName}; Flags: fixed; Types: full;
Name: CDI\instal; Description: Установить {#MyAppName}; Flags: exclusive
Name: CDI\Portable; Description: Распаковать {#MyAppName}; Flags: exclusive
Name: icons; Description: {cm:AdditionalIcons}; Types: full;
Name: icons\desktop; Description: {cm:CreateDesktopIcon}; Types: full;
Name: icons\quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; OnlyBelowVersion: 0,6.1; Types: full;
Name: icons\quicklaunchicon7; Description: {cm:CreateQuickLaunchIcon}; MinVersion: 0,6.1; Types: full;
Name: InterfaceLang; Description: {cm:InterfaceLang}; Flags: fixed; Types: full;
Name: InterfaceLang\ru; Description: Русский; Flags: exclusive;
Name: InterfaceLang\en; Description: Английский; Flags: exclusive;
Name: InterfaceLang\ua; Description: Украинский; Flags: exclusive;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
Source: ico.ico; DestDir: {app}; Flags: ignoreversion
Source: PinToTasckbar.vbs; DestDir: {tmp}; Flags: deleteafterinstall; Components: CDI\instal;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов
Source: {app}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: "CDI\instal CDI\Portable";

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Components: CDI\instal;
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}; Components: CDI\instal;
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}; Components: CDI\instal;
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Components: CDI\instal;
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: {app}\{#MyAppExeName}; Components: CDI\instal;

[Run]
Filename: {app}\{#MyAppExeName}; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait skipifsilent PostInstall;
Filename: {tmp}\PinToTasckbar.vbs; Parameters: """{app}\{#MyAppExeName}"""; Flags: shellexec; Components: CDI\instal;

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

const
///////////////////////////////////Относится к лого и изображениям мастера
  RT_RCDATA            = 10;

function UninstallMyApp(): Boolean;
var
    Buff: String;
    i: Integer;
begin
    Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
    if not Result then Result := not FileExists(RemoveQuotes(Buff));
    if not Result then if MsgBox(CustomMessage('Msg1'), mbError, MB_YESNO) = IDYES then
    try
        Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
    finally
        Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
        if not Result then MsgBox(CustomMessage('MsgErorr'), mbError, MB_OK);
    end;
end;

var
///////////////////////////////////Лого и изображения
 lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
 BtnImage: TBitmapImage;
///////////////////////////////////////////
 iInitialize: Boolean;
 TDV: TFolderTreeView;
 TFV: TStartMenuFolderTreeView;

///////////////////////////////////Ресурсы(относится к лого и изображениям мастера)
function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
  lResStream: TResourceStream;
begin
  lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  finally
  lResStream.Free;
  Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
  end;
end;

procedure TDVOnChange(Sender: TObject);
begin
if IsComponentSelected('CDI\instal') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#MyAppName}';
if IsComponentSelected('CDI\Portable') then
  WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#MyAppName} Portable';

end;
////////////////////////////////

///////////////////////////////////Дерево выбора папки программ
procedure TFVOnChange(Sender: TObject);
begin
if IsComponentSelected('CDI\instal') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#MyAppName}';
if IsComponentSelected('CDI\Portable') then
  WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#MyAppName} Portable';
  end;

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
    if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

function InitializeSetup:boolean;

begin
    Result := UninstallMyApp();
end;

procedure InitializeWizard;
begin
PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage
  with WizardForm do
  begin

///////////////////////////////////Логотип и изображения мастера
    iInitialize := True;
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
    begin
///////////////////////////////////Изображения
      bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
      WizardBitmapImage.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(WelcomePage.Handle);

      bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
      WizardBitmapImage2.Hide;
      ImgSetVisibility(bPicHandle, True);
      ImgApplyChanges(FinishedPage.Handle);

      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);
////////////////////////////////////////////

///////////////////////////////////Логотип

      lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(318), ScaleX(124), ScaleY(40), True, True);
      ImgApplyChanges(WizardForm.Handle);
    end;

///////////////////////////////////WinTB
    ExtractTemporaryFile('WinTB.dll');
    SetTaskBarProgressValue(0, 60);
    SetTaskBarProgressState(0, TBPF_ERROR);
    TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
//////////////////////////////////////
    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(nil);
    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;

    with TLabel.Create(WizardForm) do
    begin
      Parent:=WizardForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(318), ScaleX(124), ScaleY(40));
    end;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
    wpSelectProgramGroup:
  begin
      WizardForm.NoIconsCheck.Checked:=IsComponentSelected('CDI\Portable');
    WizardForm.NoIconsCheck.Enabled:=not IsComponentSelected('CDI\Portable');
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
    end;
  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]
      if IsComponentSelected('CDI\Portable') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Portable'
    WizardForm.GroupEdit.Text := (ExpandConstant('{#SetupSetting("DefaultGroupName")} Portable'))
  end
  end;
 end;
end;

procedure DeinitializeSetup();
begin
  if iInitialize then
  begin
    gdipShutdown;
    TaskBarDestroy;
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
    begin
///////////////////////////////////Логотип и изображения мастера
      if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
      begin
///////////////////////////////////Изображения
        lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
        WizardSmallBitmapImage.Hide;
        ImgSetVisibility(lPicHandle, True);
        ImgApplyChanges(MainPanel.Handle);

///////////////////////////////////Логотип
        lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(318), ScaleX(124), ScaleY(40), True, True);
        ImgApplyChanges(UninstallProgressForm.Handle);
      end;

    with TLabel.Create(nil) do
    begin
      Parent:=UninstallProgressForm;
      AutoSize:=False;
      Transparent:= true;
      SetBounds(ScaleX(20), ScaleY(318), ScaleX(124), ScaleY(40));
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutdown;
end;


[Ini]
filename: {app}\DiskInfo.ini; Section: Setting; Key: Language; String: Russian; Components: InterfaceLang\ru;
filename: {app}\DiskInfo.ini; Section: Setting; Key: Language; string: English; Components: InterfaceLang\en;
filename: {app}\DiskInfo.ini; Section: Setting; Key: Language; string: Ukrainian; Components: InterfaceLang\ua;


мне давали скрипт на ru-board
Код:

procedure CompNotEnabled(const CompName, InString: String);
 var i:integer;
 begin
  with WizardForm.ComponentsList do
  begin
    for i:=1 to Items.Count-1 do
    begin
      if ItemCaption[i]=InString then break;
    end;
    Checked[i]:=not IsComponentSelected(CompName);
    ItemEnabled[i]:=not IsComponentSelected(CompName);
  end;
 end;
 
 procedure CompOnCheckClick(Sender: TObject);
 begin
  CompNotEnabled(ExpandConstant('CDI\Portable'),ExpandConstant('{cm:AdditionalIcons}'));
  CompNotEnabled(ExpandConstant('CDI\Portable'),ExpandConstant('{cm:CreateDesktopIcon}'));
  CompNotEnabled(ExpandConstant('CDI\Portable'),ExpandConstant('{cm:CreateQuickLaunchIcon}'));
 end;

 procedure InitializeWizard;
  begin
        WizardForm.ComponentsList.OnClickCheck:=@CompOnCheckClick;
end;

дело в том что при выборе компонента CDI\instal я немогу убрать какую нибудь галочку с компонетов для создания ярлыков
Тест

Dimas2011 16-12-2013 00:21 2272973

Цитата:

Цитата Nordek
Nordek »

помоги как исправить ошибку http://php-studia.ru/?s=444545.png

Optitron 16-12-2013 16:20 2273268

Доброго дня! Не подскажет ли кто-нибудь, как сделать так, чтобы при установке если рядом с инсталлятором находится .reg файл, то он автоматически занесется в реестр.

Shkutu 16-12-2013 16:35 2273279

Dimas2011,
читать дальше »
похоже, что тут лишние
Код:

end;
begin

над той строкой, на которую ругается компилятор.

А вообще вроде бы уже просили выкладывать скрипт целиком, чтоб не приходилось догадываться о конкретном месте/контексте ошибки, ибо телепатов тут нет. Ну или если скрин, так хоть делайте его так, чтоб хотя бы проблемную функцию целиком было видно.
Optitron,
например так
читать дальше »

Код:

if FileExists('имя_файла.reg') then
  Exec(ExpandConstant('{win}') + '\regedit.exe', 'имя_файла.reg', '', SW_HIDE, ewWaitUntilTerminated, i);


Raz3r 16-12-2013 18:08 2273330

Подскажите пожалуйста как через секцию code сделать чекбокс для иконки на рабочий стол.
Нашел код,
читать дальше »
var
QuickLaunchIcon: TCheckBox;

function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon.Checked;
end;

procedure InitializeWizard();
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;

...но не могу понять как это связать с секцией [Icons] или [Tasks]

Nordek 16-12-2013 18:24 2273338

Цитата:

Цитата Optitron
как сделать так, чтобы при установке если рядом с инсталлятором находится .reg файл, то он автоматически занесется в реестр. »

Код:

[Run]
Filename: regedit.exe; Parameters: /S {src}\Файл_реестра.reg; WorkingDir: {win}; Flags: skipifdoesntexist

или

Код:

[Run]
Filename: {win}\regedit.exe; Parameters: /S {src}\Файл_реестра.reg; Flags: skipifdoesntexist


Shkutu 16-12-2013 18:41 2273345

Цитата:

Цитата Raz3r
как это связать с секцией [Icons] »

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

[Icons]
Name: "{commondesktop}\имя_ярлыка"; Filename: "{app}\my_app_name.exe"; Check: MakeQuickLaunchIcon

Аналогично с [Tasks] - добавить Check: MakeQuickLaunchIcon. Правда, если речь только об одной иконке, то имхо добавлять в [Tasks] ничего не надо

Raz3r 16-12-2013 18:53 2273349

Цитата:

Правда, если речь только об одной иконке, то имхо добавлять в [Tasks] ничего не надо
К сожалению речь идет о двух иконках.
Вот:

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone

[Icons]
Name: "{commondesktop}\Crysis Wars EX 32bit"; Filename: "{code:MyConst}\Bin32\Crysis.exe"; Parameters: "-MOD CrysisWars_EX"; Tasks: desktopicon
Name: "{commondesktop}\Crysis Wars EX 64bit"; Filename: "{code:MyConst}\Bin64\Crysis.exe"; Parameters: "-MOD CrysisWars_EX"; Tasks: desktopicon

Всё это я спрашиваю потому, что после распаковки инсталлера с командной строкой \silent не устанавливаются ярлыки на рабочий стол. Очень важно, чтоб они устанавливались автоматический.

Optitron 16-12-2013 19:40 2273376

Nordek, К сожалению данные не заносятся. Проверял на 7 и XP. Вручную вносить получается.

Nordek 16-12-2013 19:58 2273391

Optitron,
читать дальше »
Цитата:

Цитата Optitron
сожалению данные не заносятся. »

Как? Я прежде чем сюда писать, лично проверяю.
Файл reg должен лежать рядом с инсталлятором.

Для начала проверь, так ли это.
Код:

[Run]
Filename: regedit.exe; Parameters: /S {src}\Файл_реестра.reg; WorkingDir: {win}

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




Обрати внимание на {src}\Файл_реестра.reg.

Код:

{src}\ТВОЙ_ФАЙЛ_РЕЕСТРА.reg
Код:

{src}\ЗДЕСЬ_ВПИСЫВАЕШЬ_НАЗВАНИЕ_ТВОЕГО_REG_ФАЙЛА.reg
тем более сам сказал что нужно рядом с инсталлятором. Если файл reg находится в папке, то так нужно было и говорить, что файл находится в папке.

Если файл reg находится в какой нибудь папке, то нужно сделать так:
Код:

{src}\TВОЯ_ПАПКА\ТВОЙ_ФАЙЛ_РЕЕСТРА.reg
Код:

{src}\ЗДЕСЬ_ВПИСЫВАЕШЬ_НАЗВАНИЕ_ТВОЕЙ_ПАПКИ\ЗДЕСЬ_ВПИСЫВАЕШЬ_НАЗВАНИЕ_ТВОЕГО_REG_ФАЙЛА.reg
соответственно папка должна находится рядом а в ней файл reg.

Raz3r 16-12-2013 20:05 2273394

Извините что досаждаю, можно узнать какой командой прописать иконку в "Установка и удаление программ"?

Shkutu 16-12-2013 20:06 2273395

Raz3r, так тебе чекбокс нужен или чтоб ярлыки устанавливались, когда пользователь не может сам галки выставить (т е в "тихом" режиме)?
Если надо, чтобы ярлык устанавливался автоматически, без пользователя, просто убери
Код:

Tasks: desktopicon
из параметров ярлыка

Raz3r 16-12-2013 20:20 2273400

Shkutu, Я хотел, чтобы можно было управлять установкой иконок в обычном режиме установки и что бы они автоустанавливались в режиме /silent.
Благо я уже в этом разобрался, спасибо вам.

Напоследок просто хотел спросить как сделать, чтобы было видно иконку в "Установка и удаление программ", а то там не отображается. Наверное потому что программа использует .exe файл другой программы для запуска.

Optitron 16-12-2013 20:22 2273401

Nordek, .reg файл лежит рядом с инсталлятором. Название .reg файла везде одинаковое (1.reg), Убрав Flags, ошибку не выдало, тем менее опять же не занеслось.
Доп. информация: кроме занесения информации из 1.reg инсталлятор заносит в реестр кое-какие данные, но даже если убрать их, то все-равно не занесется.
Shkutu, в вашем методе жалуется на "i", ещё до этого (как я понял) жаловалась на отсутствие begin (добавил begin и end, перестала жаловаться).

gvshil 16-12-2013 21:28 2273444

Цитата:

Цитата Raz3r
как сделать, чтобы было видно иконку в "Установка и удаление программ" »

[Setup]
UninstallDisplayIcon={app}\MyProg.exe

Farser21 16-12-2013 23:52 2273555

Всем привет, возник такой вопрос.
1) Когда наводишь на компонент, то выскакивает картинка, как задать определенные координаты картинке? Задумка сделать все картинки одного размера, и чтобы они выскакивали в одном месте.

Shkutu 17-12-2013 12:15 2273735

Optitron, тот код, что я написала - это просто оператор, который надо вставить в какую либо функцию.\
Цитата:

Цитата Optitron
жалуется на "i" »

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

Код:

procedure CurStepChanged(CurStep: tSetupStep);
var i:integer;
begin
 if (CurStep=ssPostInstall) then
 begin
  if FileExists('1.reg') then
  Exec(ExpandConstant('{win}') + '\regedit.exe', '1.reg', '', SW_HIDE, ewWaitUntilTerminated, i);
 end;
end;


Raz3r 17-12-2013 18:12 2273923

Не могу понять какой код писать в секцию [code], чтобы сделать два чекбокса для двух ярлыков на рабочий стол.
И связывать их одной командой Check: MakeLaunchIcon в [Icons]?

Вот собственно код, но для одного чекбокса:
читать дальше »
var
QuickLaunchIcon: TCheckBox;

function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon.Checked;
end;

procedure InitializeWizard();
begin
LaunchIcon := TCheckBox.Create(WizardForm);
with LaunchIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Создать значки на рабочем столе';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 117;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;

Shkutu 17-12-2013 18:42 2273937

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

var
QuickLaunchIcon1, QuickLaunchIcon2 : TCheckBox;
 
procedure InitializeWizard();
begin
 QuickLaunchIcon1:= TCheckBox.Create(WizardForm);
with QuickLaunchIcon1do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Создать значок 1 на рабочем столе';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 97;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;

QuickLaunchIcon2 := TCheckBox.Create(WizardForm);
with QuickLaunchIcon1do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Создать значок 2 на рабочем столе';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 117;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;


Цитата:

Цитата Raz3r
связывать их одной командой Check: MakeLaunchIcon »

Это в смысле, чтобы они выставлялись, если выбраны одновременно?
Тогда
Код:

function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon1.Checked and QuickLaunchIcon2.Checked;
end;

Если тебе надо, чтобы чекбоксы выбирались по отдельности, то для 2го чекбокса придется написать аналогичную функцию проверки
читать дальше »
Код:

function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon2.Checked;
end;

и использовать в [Icons] ее

Nordek 17-12-2013 18:44 2273938

Цитата:

Цитата Optitron
файл лежит рядом с инсталлятором. Название .reg файла везде одинаковое (1.reg) »

Код:

[Run]
Filename: {win}\regedit.exe; Parameters: "/S ""{src}\1.reg"""; Flags: skipifdoesntexist

Цитата:

Цитата Optitron
Убрав Flags, ошибку не выдало »

Знаю почему, проверил.

Nordek 17-12-2013 23:48 2274075

Farser21,
читать дальше »
Цитата:

Цитата Farser21
как задать определенные координаты картинке? »

1.
Код:

  Left := ScaleX(650);    // Слева
 
Top := ScaleY(450);    // Сверху
 
Width := ScaleX(209);  // Ширина
 
Height := ScaleY(169);  // Высота

2.
Код:

// Left (Слева)          Top (Сверху)          Width (Ширина)          Height (Высота)
 
SetBounds(ScaleX(650), ScaleY(450),          ScaleX(200),            ScaleY(200));

Пример:
Код:

procedure ShowPicHint(const PicFilePath: String);
var
   
pt: TPoint;
begin
    if not
GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with
PicForm do
        begin
//            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
           
Left := ScaleX(650);    // Слева
           
Top := ScaleY(450);    // Сверху
           
Width := ScaleX(209);  // Ширина
           
Height := ScaleY(169);  // Высота
           
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
       
SetFocus(WizardForm.Handle);
    end;
end;

Пример 2:
Код:

procedure ShowPicHint(const PicFilePath: String);
var
   
pt: TPoint;
begin
    if not
GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with
PicForm do
        begin
//            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
//          Left (Слева)          Top (Сверху)          Width (Ширина)          Height (Высота)
           
SetBounds(ScaleX(650), ScaleY(450),          ScaleX(200),            ScaleY(200));
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
       
SetFocus(WizardForm.Handle);
    end;
end;


Dimas2011 18-12-2013 18:51 2274508

Помогите исправить ошибку http://php-studia.ru/?s=444545.png

Nordek 19-12-2013 06:53 2274761

Dimas2011, Да, сколько времени прошло?!
Ну вот что тебе, кроме скрина трудно что-ли было кусок кода в месте ошибки скопировать и вставить сюда?
И если делаешь скрин, то делай правильно - чтоб видно было (а то гадай, какая у тебя там процедура).

Тебе так никто помогать не станет, потому что приходится угадывать что у тебя там.
Тем более переписывать код чтоб ты понял (Делаю вывод из того, что когда тебе Shkutu подсказала и ты не понял, то я не знаю. Тебе разжёвывать прямо надо и за тебя съесть. В следующий раз, если попадётся случай. Тоже сделаю скрин кода, да так чтоб ты за ним часа четыре просидел и подумал.), кому охота? Мне точно лень.
Вместо грамотно составленного сообщения, ты продолжаешь одно и тоже сообщение отправлять. Не надоедает?
Остальных, кто делает подобное тоже касается. Если хотите чтоб вам помогли, то составляйте своё сообщение грамотно. И чтоб не приходилось страдать геморроем тем, кто вам помогает.
Так же нужно понимать грань между помогите и сделайте за меня. Помочь можно, но делать за вас никто не будет. Наглеть тоже не нужно, т.е по несколько раз одно и тоже сообщение отправлять. Кто сочтёт нужным - тот обязательно поможет, а нет - так нет.




Цитата:

Цитата Dimas2011
Помогите исправить ошибку »

Смотри, ты скопировал а вот вставить толком то не смог.
У тебя было так (примерно):
Код:

function InitializeSetup(): Boolean;
begin
 
Result := InitializeSetup1(); if not Result then exit;
end;

далее, ты скопировал совместил и получилось так:
Код:

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! '+#13#10+'Будет предложен альтернативный путь установки, либо укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;
begin
 
Result := InitializeSetup1(); if not Result then exit;
end;

твоя ошибка находится здесь (отметил красным и выделил жирным):

Код:

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! '+#13#10+'Будет предложен альтернативный путь установки, либо укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;
begin

  Result := InitializeSetup1(); if not Result then exit;
end;

и то что отмечено красным, нужно было удалить.

Итог твоего кода должен был получиться таким:
Код:

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! '+#13#10+'Будет предложен альтернативный путь установки, либо укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
  Result := InitializeSetup1(); if not Result then exit;
end;


Shkutu 19-12-2013 13:13 2274869

Всем доброго времени суток!
Есть проблема: нужно устанавливать IIS в процессе инсталляции. Если использовать [Run], то все отлично
Код:

[Run]
Filename: "pkgmgr"; Parameters: "/iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-Security;IIS-BasicAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI"; Description: "Install IIS"; Flags: 64bit; Check: IsWin64;
Filename: "pkgmgr"; Parameters: "/iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-Security;IIS-BasicAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI"; Description: "Install IIS"; Flags: 32bit; Check: not IsWin64;

Но т к установка IIS требуется в самом начале инсталляции, до других операций, то приходится выносить это в Execute
Код:

Exec(ExpandConstant('{sys}\pkgmgr'),
 '/iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;IIS-FTPPublishingService;IIS-FTPServer;IIS-FTPManagement;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI',
        '', SW_SHOW, ewWaitUntilTerminated, i);

При этом оно ругается на попытку загрузки файла, имеющего неверный формат. Судя по всему он пытается использовать версию менеджера/пакетов с неверной разрядностью. Собственно, вопрос: можно ли как-то для Execute указать необходимую разрядность аналогично Run. Можно было бы использовать вилку с IsWin64, но пока не пойму, как это правильнее сделать. Может, кто-то подскажет?

Farser21 19-12-2013 21:07 2275192

Nordek, спасибо!

Respin 20-12-2013 00:29 2275330

Господа. Кому не жалко поделитесь, пожалуйста, скриптом сколько скопировано мегабайт/гегабайт из инсталлятора.

Цитата:

Цитата Shkutu
Собственно, вопрос: можно ли как-то для Execute указать необходимую разрядность аналогично Run »

Если я правильно понял...

function InitializeSetup(): Boolean;
begin
if isWin64 then...
else...
end;

Shkutu 20-12-2013 12:08 2275550

Respin, я видимо, не совсем корректно задаю вопросы :)
И так понятно, что это надо как-то через вилку с isWin64. Проблема в другом. Когда запуск идет из секции [Run], инно сам знает в какую системную директорию лезть и какую версию пакета (соответствующую разрядности) брать и например константа {sys} будет указывать на системную директорию правильной разрядности. Когда речь об Execute, эти директории надо как-то определить самостоятельно, потому что та же {sys} будет указывать на директорию для 32 бит, даже в 64 битной системе.
Цитата:

Цитата Shkutu
использовать вилку с IsWin64, но пока не пойму, как это правильнее сделать. »

Это в том смысле, какие в каком случае (32/64 бит) директории юзать. Или есть ли какой флаг или еще что, что можно использовать кроме isWin64.

Tco 03 20-12-2013 15:53 2275659

Цитата:

Цитата Respin
Кому не жалко поделитесь, пожалуйста, скриптом сколько скопировано мегабайт/гегабайт из инсталлятора. »

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

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg

[Files]
Source: innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs;

[ Сode]
const
oneMB=1024*1024;

type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
FullSize: Extended;
TimerID: LongWord;

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('%.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 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 ByteOrTB(Bytes: Extended; noMB: Boolean): String; {Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 2х знаков после запятой)}
Begin
if not noMB then Result:= NumToStr(Int(Bytes)) +' Mb' else
if Bytes < 1024 then if Bytes = 0 then Result:= '0' else Result:= NumToStr(Int(Bytes)) +' Bt' else
if Bytes/1024 < 1024 then Result:= NumToStr(round((Bytes/1024)*10)/10) +' Kb' else
If Bytes/oneMB < 1024 then Result:= NumToStr(round(Bytes/oneMB*100)/100) +' Mb' else
If Bytes/oneMB/1000 < 1024 then Result:= NumToStr(round(Bytes/oneMB/1024*1000)/1000) +' Gb' else
Result:= NumToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Tb';
End;

function CalcDirSize(const fromDir, fileMask: string; SubDirsAllow: Boolean): Extended;
var
FSR, DSR: TFindRec; FindResult: Boolean; APath: string;
Begin
APath:= AddBackslash(fromDir);
FindResult:= FindFirst(APath + fileMask, FSR);
Try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then Result:= Result + Size64(FSR.SizeHigh, FSR.SizeLow)
FindResult:= FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult and SubDirsAllow do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} Result:= Result + CalcDirSize(APath + DSR.Name, fileMask, SubDirsAllow);
// если есть хоть одна рекурсия, то подсчёт почему-то не прерывается
FindResult:= FindNext(DSR);
end;
Finally
FindClose(FSR); FindClose(DSR);
end;
End;

procedure GetExtractSize();
begin
//Так как ClcDirSize суммирует полученные размеры, то сначала обнуляем счетчик
FullSize:=0;
FullSize:=CalcDirSize(ExpandConstant('{app}'), '*', true)
WizardForm.StatusLabel.Caption:= 'Общий объем извлеченных файлов ' + ByteOrTB(FullSize, true)
end;

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
if WizardForm.CurPageID = wpInstalling then GetExtractSize();
End;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
TimerID:= SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4));
end;
end;


Цитата:

Цитата Shkutu
Это в том смысле, какие в каком случае (32/64 бит) директории юзать. »

Если я тоже правильно понял...

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

Код:

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\AppName

[ Code]
function InitializeSetup: Boolean;
begin
// Check IsWin64 before using a 64-bit-only feature to
// avoid an exception when running on 32-bit Windows.
if IsWin64 then
MsgBox('64-bit program files reside in: ' +
ExpandConstant('{pf64}'), mbInformation, MB_OK)
else
MsgBox('32-bit program files reside in: ' +
ExpandConstant('{pf32}'), mbInformation, MB_OK);
result:=true;
end;


Shkutu 20-12-2013 16:16 2275675

Tco 03, почти:)
С Program files все понятно. А что делать с {sys} (для установки ISS нужна именно она)? Она и в 32 и 64 указывает на одно и то же место - system32 для 32 бит.

Tco 03 20-12-2013 16:47 2275707

Цитата:

Цитата Shkutu
А что делать с {sys} (для установки ISS нужна именно она)? Она и в 32 и 64 указывает на одно и то же место »

Тогда наверное так:
читать дальше »
Код:

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\AppName

[ Code]
const
  MAX_PATH = 260;
  CSIDL_SYSTEM = $25;
  CSIDL_SYSTEMX86 = $29;

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;

function InitializeSetup: Boolean;
begin
if IsWin64 then
  MsgBox(GetSpecialPath(CSIDL_SYSTEMX86), mbInformation, MB_OK)
else
  MsgBox(GetSpecialPath(CSIDL_SYSTEM), mbInformation, MB_OK);
  Result:= True;
end;


Shkutu 20-12-2013 17:36 2275741

Tco 03, да, это похоже на то, что мне нужно.
Буду пробовать, спасибо:)

dima.dmitrienko.71@fb 21-12-2013 17:36 2276257

Всем привет вы бы не могли подсказать вот этот скрип можо сделать чтобы не только картинка вылезала а и описание??
Код:

Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
Compression=none
AppId=TheBestAppId
DisableWelcomePage=yes
DisableFinishedPage=yes
DisableDirPage=yes
DisableReadyPage=yes


[Components]
Name: hl2; Description: Half-Life 2; Flags: disablenouninstallwarning
Name: hl2\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: hl2\en; Description: English; Flags: disablenouninstallwarning exclusive

Name: ep1; Description: Half-Life 2 Episode One; Flags: disablenouninstallwarning
Name: ep1\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: ep1\en; Description: English; Flags: disablenouninstallwarning exclusive

Name: ep2; Description: Half-Life 2 Episode Two; Flags: disablenouninstallwarning
Name: ep2\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: ep2\en; Description: English; Flags: disablenouninstallwarning exclusive

Name: portal; Description: Portal; Flags: disablenouninstallwarning
Name: portal\ru; Description: Russian; Flags: disablenouninstallwarning exclusive
Name: portal\en; Description: English; Flags: disablenouninstallwarning exclusive


[Files]
Source: Wasteland_Scanner_con.bmp; Flags: dontcopy nocompression
Source: Strider_early2.bmp; Flags: dontcopy nocompression
Source: Cremator_poster.bmp; Flags: dontcopy nocompression
Source: Portal.bmp; Flags: dontcopy nocompression


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

const
    UNDEF_INDEX = -777;
    ALPHA_BLEND_LEVEL = 128; // max=Byte=255

    WS_EX_LAYERED = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY = 1;
    LWA_ALPHA = 2;
    GWL_EXSTYLE = (-20);


var
    InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;


type
    COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with PicForm do
        begin
            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            Show;
        end;
    finally
        SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
    UndefPic: String;
begin
    if Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case TNewCheckListBox(Sender).ItemCaption[Index] of
            'Half-Life 2': UndefPic := 'Wasteland_Scanner_con.bmp';
            'Half-Life 2 Episode One': UndefPic := 'Strider_early2.bmp';
            'Half-Life 2 Episode Two': UndefPic := 'Cremator_poster.bmp';
            'Portal': UndefPic := 'Portal.bmp';
        else
            begin
                LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
        LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
    PicForm.Hide;
    LastIndex := -1;
end;


procedure InitInfo();
begin
    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
        BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
            Parent := PicForm;
            AutoSize := True;
        end;
    end;
    SetWindowLong(PicForm.Handle, GWL_EXSTYLE, GetWindowLong(PicForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(PicForm.Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
end;


procedure InitializeWizard();
begin
    InitInfo();
end;


Mat_y 21-12-2013 23:08 2276486

Код:

ошибка runtime error (at 145:123) could not call proc
Кто знает чем лечить? у 1 человека только такое было.. остальные нормально запускают

Shkutu 22-12-2013 03:13 2276578

Mat_y, у меня такое обычно бывает, если какой-то косяк с библиотекой. Но может возникать и из-за чего-то еще. Так что нужно больше информации:) В какой момент ошибка возникает? На какую сточку кода ругается?

Tco 03 22-12-2013 09:51 2276625

Цитата:

Цитата Shkutu
На какую сточку кода ругается? »

:spy: Ошибка уже всё сама за себя сказала: (at 145:123) - строка 145 - символ 123

Mat_y 22-12-2013 17:49 2276850

Цитата:

Цитата Shkutu
Так что нужно больше информации В какой момент ошибка возникает? На какую сточку кода ругается? »

Из 300 тысяч запускавших только у одного такая фигня. При компиляции проблем нет.
Цитата:

Цитата Tco 03
Ошибка уже всё сама за себя сказала: (at 145:123) - строка 145 - символ 123 »

спасибо. откуда считать начинать? просто так вообще попадаю на секцию Components.. а в коде еще полно выносок типа #include

Nordek 22-12-2013 20:31 2276922

Цитата:

Цитата Mat_y
откуда считать начинать? »


Dimon585h 22-12-2013 21:32 2276955

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

Mat_y 23-12-2013 09:28 2277144

Цитата:

Цитата Nordek
Так тоже не понятно? »

Нет, не понятно... в таком случае мы попадаем на пустое место. Вообще вся 145 строка попадает на секцию COMPONENTS... где нечему ломаться... а 123 символ уходит далеко за пределы написанного... ошибка возникает уже на скомпилированном скрипте... я предпологаю, что в этом случае правильно начинать считать с секции CODE... и если считать оттуда, то как учитывать внешние секции CODE,которые вынесены в отдельный фаил через #include

Nordek 23-12-2013 09:45 2277147

Цитата:

Цитата Mat_y
то как учитывать внешние секции CODE »

Пересобрать без модулей и дать тому человеку протестировать, для того чтоб узнать на каком месте в этот раз выпадет ошибка (at XXX:XXX). Полагаю после сборки, она может быть вызвана уже в другом месте. Да к тому же на сколько помню, у тебя в скрипте много дублей.

Цитата:

Цитата Mat_y
которые вынесены в отдельный фаил через #include »

От того всегда не любил модульную структуру скрипта и стараюсь собирать полный скрипт.

Shkutu 23-12-2013 12:22 2277204

Tco 03, прям просто КО. Извините:)
Но вообще говоря, когда я спрашивала про строчку, я имела ввиду именно строку, а не номер. Может где-то в истории это было раньше, а я пропустила, но тем не менее, сам скрипт я не видела.
Mat_y, а нельзя запустить это из отладчика? В этом случае оно стопорнется на строке с ошибкой и даже цветом эту строку выделит. Ну или если нельзя (я так понимаю, что ошибка не у тебя), то да, можно попробовать пересобрать без модулей и посмотреть.

Nordek 23-12-2013 12:28 2277209

Цитата:

Цитата Shkutu
я так понимаю, что ошибка не у тебя »

Shkutu, В том то и дело что не у него
Цитата:

Цитата Mat_y
Из 300 тысяч запускавших только у одного такая фигня. При компиляции проблем нет. »

Цитата:

Цитата Shkutu
то да, можно попробовать пересобрать без модулей и посмотреть. »

По хорошему там весь скрипт переписывать нужно.

diman_21Ru 24-12-2013 15:00 2277792

Парни на 5.5.4 не работает

tuz-veta 24-12-2013 21:02 2277975

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

Nordek 24-12-2013 22:19 2278027

Цитата:

Цитата diman_21Ru
Парни на 5.5.4 не работает »

Что значит не работает?
Если ты про расширенную версию говоришь, то её ещё не существует.
Есть только 5.5.1


Цитата:

Цитата tuz-veta
Какой функцией удалить все содержимое папки »

Удалить перед установкой:
Код:

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


diman_21Ru 25-12-2013 10:38 2278217

Парни что за ошибка procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea); неизвестный тип

habib2302 26-12-2013 21:11 2279049

Доброе время суток.Возможно ли указать 2 компонент в командную строку для тихой установки?

Optitron 26-12-2013 21:13 2279054

habib2302, вроде как
Код:

/Components="название 2 компонента"

habib2302 26-12-2013 21:19 2279059

Цитата:

Цитата Optitron
/Components="название 2 компонента" »

я имел виду
Цитата:

/Components=Portable /Components=Ru

Nordek 27-12-2013 03:24 2279192

habib2302, Посмотри справку: "Прочая информация » Параметры командной строки инсталлятора".
Далее по тексту »
Цитата:

Цитата Параметры командной строки инсталлятора
/COMPONENTS="comma separated list of component names"
Меняет выбранные по умолчанию компоненты. В этом случае параметр командной строки указывает инсталлятору менять тип установки на Выборочный. If no custom type is defined, this parameter is ignored.

Only the specified components will be selected; the rest will be deselected.

If a component name is prefixed with a "*" character, any child components will be selected as well (except for those that include the dontinheritcheck flag). If a component name is prefixed with a "!" character, the component will be deselected.

This parameter does not change the state of components that include the fixed flag.

Например:
Код:

Deselect all components, then select the "help" and "plugins" components:
/COMPONENTS="help,plugins"

Например:
Код:

Deselect all components, then select a parent component and all of its children with the exception of one:
/COMPONENTS="*parent,!parent\child"



А вообще, /SAVEINF="filename" и /LOADINF="filename" рулят ;).

diman_21Ru 27-12-2013 12:56 2279303

на 5.5.1 наботает все окей спасибо

Ivan_009 28-12-2013 22:09 2279971

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

PHP код:

[Setup]
AppName={#GameName}
AppVerName={#GameName} {#Version}
AppPublisher={#Publisher}
DefaultDirName={pf}{#GameName}
DefaultGroupName={#GameName}
OutputDir=Setup

[Languages]
NameRusMessagesFilecompiler:LanguagesRussian.isl

[Files]
SourceInstallFiles*; DestDir: {app}; FlagsignoreversionAttribshidden system;

[
code]

#include "Modules\botva2.iss"


var
Work1,Work2,Work3,Work4,Work5,Work6,WizardImageLongint;
//StatusPanel: TPanel;
CaptionLabel,StLabelTLabel;
//---Skin
procedure LoadSkin(lpszPathStringlpszIniFileNameString); external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';
procedure LoadSkinU(lpszPathStringlpszIniFileNameString); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
//---Skin
//---Splash
//procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
//---Splash

function InitializeSetup(): Boolean;
begin
//---Botva2
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if 
not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
//---Botva2
//---Skin
ExtractTemporaryFile('Skin.skin');
LoadSkin(ExpandConstant('{tmp}\Skin.skin'), '');
//---Skin
Result:= true
end
;

procedure InitializeWizard;
begin
with WizardForm 
do begin
Width
:=ScaleX(796);   
Height:=ScaleY(622); 
Position:=poScreenCenter
CancelButton.SetBounds(ScaleX(691), ScaleY(570), ScaleX(95), ScaleY(20));
NextButton.SetBounds(ScaleX(590), ScaleY(570), ScaleX(95), ScaleY(20));
BackButton.SetBounds(ScaleX(489), ScaleY(570), ScaleX(95), ScaleY(20));
InnerNotebook.Hide;
OuterNotebook.Hide;
Bevel.Hide;
Color:=$000000;

with WizardForm.DirEdit do
begin
Left 
:= ScaleX(4);
Top := ScaleY(568);
Width := ScaleX(483);
Height := ScaleY(20);
Parent:=WizardForm;
end;

with WizardForm.GroupEdit do
begin
Left 
:= ScaleX(4);
Top := ScaleY(568);
Width := ScaleX(483);
Height := ScaleY(20);
Parent:=WizardForm;
end;

//---Splash
//ExtractTemporaryFile('Splash.png');
//ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
//---Splash
//---Botva2
Work1:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\1.png'),0,0,790,593,True,True);
Work2:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\2.png'),0,0,790,593,True,True);
Work3:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\3.png'),0,0,790,593,True,True);
Work4:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\4.png'),0,0,790,593,True,True);
Work5:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\5.png'),0,0,790,593,True,True);
Work6:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\6.png'),0,0,790,593,True,True);
WizardImage:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\WizardImage.jpg'),1,15,788,481,True,True);

ImgSetVisibility(Work1False);
ImgSetVisibility(Work2False);
ImgSetVisibility(Work3False);
ImgSetVisibility(Work4False);
ImgSetVisibility(Work5False);
ImgSetVisibility(Work6False);
//---Botva2
end;
ImgApplyChanges(WizardForm.Handle);
end;

procedure CurPageChanged(CurPageIDInteger);
begin
ImgSetVisibility
(Work1False);
ImgSetVisibility(Work2False);
ImgSetVisibility(Work3False);
ImgSetVisibility(Work4False);
ImgSetVisibility(Work5False);
ImgSetVisibility(Work6False);
WizardForm.DirEdit.Hide;
WizardForm.GroupEdit.Hide;
case 
CurPageID of
wpWelcome
:
begin
ImgSetVisibility
(work1,True);
end;
wpSelectDir:
begin
ImgSetVisibility
(work2,True);
WizardForm.DirEdit.Show;
end;
wpSelectProgramGroup:
begin
ImgSetVisibility
(work3,True);
WizardForm.GroupEdit.Show;
end;
wpInstalling:
begin
ImgSetVisibility
(work4,True);
end;
wpFinished:
begin
ImgSetVisibility
(work5,True);
end;
end;
ImgApplyChanges(WizardForm.Handle);
end;

//---Skin
function InitializeUninstall(): Boolean;
begin
FileCopy
(ExpandConstant('{app}\isskin.dll'),
ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\Skin.skin'),
ExpandConstant('{tmp}\Skin.skin'), False); LoadSkinU(ExpandConstant('{tmp}\Skin.skin'), '');
Result:=True;
end;
//---Skin

procedure CancelButtonClick(CurPageIDInteger; var CancelConfirmBoolean);
begin
Confirm
:=False;
Cancel:=True;
end;

procedure DeinitializeSetup();
begin
//---Skin
UnloadSkin();
//---Skin
//---Botva2
gdipShutdown;
//---Botva2
end;

//---Skin
procedure DeinitializeUninstall();
begin
UnloadSkinU
();
end;
//---Skin 


vint56 28-12-2013 22:36 2279993

Ivan_009
читать дальше »
#define GameName "Dead Space 3"
#define Version "Dead Space 3"
#define MyAppExeName "MyProg.exe"

[Setup]
AppName={#GameName}
AppVerName={#GameName} {#Version}

DefaultDirName={pf}{#GameName}
DefaultGroupName={#GameName}
OutputDir=Setup

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



[Files]
Source: InstallFiles\*; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system;


[Icons]
Name: "{group}\{#GameName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#GameName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#GameName}"; Filename: "{app}\{#MyAppExeName}";


[code]

#include "Modules\botva2.iss"


var
Work1,Work2,Work3,Work4,Work5,Work6,WizardImage: Longint;
//StatusPanel: TPanel;
CaptionLabel,StLabel: TLabel;
//---Skin
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
//---Skin
//---Splash
//procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
//---Splash

function InitializeSetup(): Boolean;
begin
//---Botva2
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
//---Botva2
//---Skin
ExtractTemporaryFile('Skin.skin');
LoadSkin(ExpandConstant('{tmp}\Skin.skin'), '');
//---Skin
Result:= true
end;

procedure InitializeWizard;
begin
with WizardForm do begin
Width:=ScaleX(796);
Height:=ScaleY(622);
Position:=poScreenCenter;
CancelButton.SetBounds(ScaleX(691), ScaleY(570), ScaleX(95), ScaleY(20));
NextButton.SetBounds(ScaleX(590), ScaleY(570), ScaleX(95), ScaleY(20));
BackButton.SetBounds(ScaleX(489), ScaleY(570), ScaleX(95), ScaleY(20));
InnerNotebook.Hide;
OuterNotebook.Hide;
Bevel.Hide;
Color:=$000000;

//---Splash
//ExtractTemporaryFile('Splash.png');
//ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False, $FFFFFF,10);
//---Splash
//---Botva2
Work1:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\1.png'),0,0,790,593,True,True);
Work2:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\2.png'),0,0,790,593,True,True);
Work3:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\3.png'),0,0,790,593,True,True);
Work4:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\4.png'),0,0,790,593,True,True);
Work5:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\5.png'),0,0,790,593,True,True);
Work6:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\6.png'),0,0,790,593,True,True);
WizardImage:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\WizardImage.jpg'),1,15,788,481,True,Tru e);
ImgApplyChanges(WizardForm.Handle);

with WizardForm.DirEdit do
begin
Left := ScaleX(4);
Top := ScaleY(568);
Width := ScaleX(483);
Height := ScaleY(20);
Parent:=WizardForm;
end;

with WizardForm.GroupEdit do
begin
Left := ScaleX(4);
Top := ScaleY(568);
Width := ScaleX(483);
Height := ScaleY(20);
Parent:=WizardForm;
end;

with WizardForm.ProgressGauge do
begin
Left := ScaleX(10);
Top := ScaleY(220);
Width := ScaleX(390);
Parent:= WizardForm;
end;
end;
end;

procedure ShowComponents(CurPageID: Integer);
begin
WizardForm.DirEdit.Hide;
WizardForm.GroupEdit.Hide;
WizardForm.ProgressGauge.Hide;
case CurPageID of
wpWelcome:
begin
ImgSetVisibility(work1,True);
end;
wpSelectDir:
begin
ImgSetVisibility(work2,True);
WizardForm.DirEdit.Show;
end;
wpSelectProgramGroup:
begin
ImgSetVisibility(work3,True);
WizardForm.GroupEdit.Show;
end;
wpInstalling:
begin
ImgSetVisibility(work4,True);
WizardForm.ProgressGauge.show;
end;
wpFinished:
begin
ImgSetVisibility(work5,True);
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ImgSetVisibility(Work1, False);
ImgSetVisibility(Work2, False);
ImgSetVisibility(Work3, False);
ImgSetVisibility(Work4, False);
ImgSetVisibility(Work5, False);
ImgSetVisibility(Work6, False);
ShowComponents(CurPageID);
ImgApplyChanges(WizardForm.Handle);
end;

//---Skin
function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'),
ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\Skin.skin'),
ExpandConstant('{tmp}\Skin.skin'), False); LoadSkinU(ExpandConstant('{tmp}\Skin.skin'), '');
Result:=True;
end;
//---Skin

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
Cancel:=True;
end;

procedure DeinitializeSetup();
begin
//---Skin
UnloadSkin();
//---Skin
//---Botva2
gdipShutdown;
//---Botva2
end;

//---Skin
procedure DeinitializeUninstall();
begin
UnloadSkinU();
end;
//---Skin

diman_21Ru 29-12-2013 11:55 2280170

Всем привет как можно убрать эту страницу , зарание спасибо :)

vint56 29-12-2013 13:36 2280204

diman_21Ru
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = SystemPage.ID) then
Result:= True;
end;

diman_21Ru 29-12-2013 15:19 2280237

спасибо большое

diman_21Ru 31-12-2013 12:55 2281141

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

Karbid87 01-01-2014 14:19 2281564

Помогите пожалуйста. нужен самый простой скрипт, в котором страница выбора компонентов, страница распаковки и страница завершения. Архивы будут запакованы FreeArc.
Идея такая: запускаем инсталл, выбираем один из двух компонентов (у компонентов будет один архив общий, а второй разный), самостоятельная распаковка во временную папку, страница завершения, автоматический запуск .exe из временной папки(можно на странице завершения сделать не убираемую галочку "Запуск установки").
И еще чтобы инсталл не создавал никаких папок в меню Пуск, ярлыков, и не было у него деинсталлятора и значка в Панели управления-Программы и компоненты.
Если кто напишет такое, буду очень благодарен.

diman_21Ru 02-01-2014 14:02 2281988

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

Nordek 02-01-2014 17:58 2282145

diman_21Ru, Найди WelcomeLabel1 и там регулируй » Left, Top, Width, Height

Например
Код:

[Code]
procedure InitializeWizard();
begin
 
WizardForm.WelcomeLabel1.Left := ScaleX(104);
  WizardForm.WelcomeLabel1.Top := ScaleY(40);
  WizardForm.WelcomeLabel1.Width := ScaleX(389);
end;


diman_21Ru 02-01-2014 19:04 2282178

о спасибо тебе огромное

diman_21Ru 02-01-2014 19:29 2282187

В одном месте все же остался шрифт прежний , не понятно он где настраивается (

Nordek 02-01-2014 20:04 2282223

Цитата:

Цитата diman_21Ru
о спасибо »

Не обязательно плодить сообщения: Как я могу отметить сообщение полезным?


Цитата:

Цитата diman_21Ru
В одном месте все же остался шрифт прежний »

Если я правильно понимаю, то тебе нужно смотреть в сторону Main Panel.

Пример:
Код:

[Code]
procedure InitializeWizard();
begin
 
WizardForm.PageDescriptionLabel.Font.Size := 8;
  WizardForm.PageDescriptionLabel.Font.Name := 'Courier New';

  WizardForm.PageNameLabel.Font.Size := 8;
  WizardForm.PageNameLabel.Font.Name := 'Courier New';
end;

Иначе, я не могу угадать что и где у тебя находится.
Ищи по надписи "Мод-Пак от..."
Если "Мод-Пак от..." задано в пользовательских сообщениях т.е [CustomMessages], то смотри там {cm:....}

Например если у тебя примерно так
Код:

[CustomMessages]
namelabelmymod=Мод-Пак от diman_21Ru...

то ищи {cm:namelabelmymod}

А далее в коде найди примерно такие значения: Font.Name и Font.Size.
Код:

Font.Name := 'Courier New'; - Это шрифт
Код:

Font.Size := 8; - Это размер шрифта
Вместо Font.Size может быть Font.Height
Код:

Font.Height := -11;
.

diman_21Ru 02-01-2014 21:40 2282265

спасибо получилось

diman_21Ru 03-01-2014 22:14 2282708

Парни если кто знает как можно музыку добавить простым способом , подскажите , или направьте на страницу где была ета тема просто искал не нашел , зарание спасибо :)

Nordek 03-01-2014 22:47 2282719

Вложений: 1
Цитата:

Цитата diman_21Ru
или направьте на страницу »

Здесь в низу страницы модуль BASS v 1.1 от Shegorat глянь (Последнюю версию 1.4 погугли или у Shegorat-а попроси).

Цитата:

Цитата diman_21Ru
простым способом »

Ниже прикрепил простой пример.

Nordek 04-01-2014 23:12 2283112

Напишу ответ здесь, на заданный вопрос из этой темы
Цитата:

Цитата qwea234
Как сделать чтобы после того как извлекло с установщика файлы, назначить моему файлу Tront.exe - запуск от имени администратора ? »

Код:

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty


qwea234 04-01-2014 23:37 2283126

Nordek, Благодарю.
А такой вопрос, у кого Windows 8, возможно только для них сделать запуск с совместимостью Windows XP Пакет обновления 3

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

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty

не будет работать ?

Nordek 04-01-2014 23:58 2283139

Цитата:

Цитата qwea234
сделать запуск с совместимостью Windows XP Пакет обновления 3 »

С запросом запуска из под администратора и с совместимостью Windows XP Service Pack 3:
Код:

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: WINXPSP3 RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty

Если нужна только совместимость, то сотри "RUNASADMIN".

qwea234 05-01-2014 08:39 2283223

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

а и совместимость с WINXPSP3 - мне нужно только для тех у кого Windows 7/8

Optitron 05-01-2014 11:25 2283251

Вложений: 1
Всем Привет. Кто знает, как убрать в странице компонентов линии и сделать один единый цвет после этого (белый цвет в серый).

Nordek 05-01-2014 16:19 2283363

Цитата:

Цитата qwea234
а сам инстоллятор возможно сделать: чтобы запускался от имени администратора ? или нет ? »

А разве он не из под администратора по умолчанию запускается?
По умолчанию там и так привилегии выставлены PrivilegesRequired=admin.

Не, если конечно не веришь, то можешь для убедительности в секции [Setup] выставить:
Код:

[Setup]
PrivilegesRequired=admin

для PrivilegesRequired возможные значения: none, poweruser, admin, или lowest

Ну, блин, не позорились что-ли - самое простое и не могут разобраться. Я к тому, что полезно справку почитать.
Скачай справку, да почитай про привилегии: ISetup.chm » Секция скриптов » Директивы секций » PrivilegesRequired.

Цитата:

Цитата qwea234
и совместимость с WINXPSP3 - мне нужно только для тех у кого Windows 7/8 »

так:
Код:

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: WINXPSP3 RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 0,6.0


qwea234 05-01-2014 16:28 2283366

Nordek,
Во спасибо!
1. нет по умолчанию я проверил созданный файл - привилегия сняты в свойствах. - сейчас проверю.
2.
Код:

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: WINXPSP3 RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 0,6.0

Ага и с этим спасибо, но тут можно маленько разъяснить - вижу вы добавили в конце только MinVersion: 0,6.0 - что это значит ? - или дайте ссылку на подобный гайд, тк я наверно уеж вас замучал, но просто охота для игроков сделать удобнее все..

Добавлено:

выставил как вы и сказали:
PrivilegesRequired=admin

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

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

Nordek 05-01-2014 16:37 2283373

Цитата:

Цитата Optitron
Кто знает, как убрать в странице компонентов линии и сделать один единый цвет после этого (белый цвет в серый). »

Вот так :):
Код:

[Code]
procedure InitializeWizard();
begin
 
WizardForm.Bevel.Visible := False;
  WizardForm.Bevel1.Visible := False;
  WizardForm.WelcomePage.Color := clBtnFace;
  WizardForm.WelcomeLabel2.Color := clBtnFace;
  WizardForm.LicenseMemo.Color := clBtnFace;
  WizardForm.PasswordEdit.Color := clBtnFace;
  WizardForm.InfoBeforeMemo.Color := clBtnFace;
  WizardForm.UserInfoSerialEdit.Color := clBtnFace;
  WizardForm.UserInfoOrgEdit.Color := clBtnFace;
  WizardForm.UserInfoNameEdit.Color := clBtnFace;
  WizardForm.DirEdit.Color := clBtnFace;
  WizardForm.ComponentsList.Color := clBtnFace;
  WizardForm.TypesCombo.Color := clBtnFace;
  WizardForm.GroupEdit.Color := clBtnFace;
  WizardForm.InfoAfterMemo.Color := clBtnFace;
  WizardForm.MainPanel.Color := clBtnFace;
  WizardForm.FinishedPage.Color := clBtnFace;
end;


Nordek 05-01-2014 16:53 2283380

Цитата:

Цитата qwea234
файл создался после генерации инсталятора и в свойствах все равно нету галочки »

Да там и так не должно никаких галочек стоять т.к самому установщику назначены административные права и всё что он делает, он делает из под администратора.
Иначе, установка в папку не была удачно произведена т.к при установке выбивало ошибку типа: "Нет прав доступа".

Цитата:

Цитата qwea234
что это значит ? »

Цитата:

Цитата Общие параметры
MinVersion
Минимальная версия Windows и Windows NT, необходимая для установки параметра. Если значение равно "0", значит на платформе Windows (если первое) или Windows NT (если на втором месте) параметр будет не действительным. Номера сборки и/или пакета обновления могут включаться в значение. Значение перекрывается значением директивы MinVersion, которая указана в секции [Setup].

Параметр, для которого не указана MinVersion, устанавливается всегда, если только другой параметр этого не запретит.

Например:
Код:

MinVersion: 4.0,4.0
MinVersion: 4.1


OnlyBelowVersion
Параметр, обратный MinVersion. Указывает максимальную версию Windows и Windows NT для записи которая не будет обработана. Например, если Вы ввели 4.1,5.0 и система Windows 95 или NT 4.0, то параметр будет действительным, но если система Windows 98 (4.1) или Windows 2000 (NT 5.0), параметр будет недействительным. Если значение равно "0", значит, параметр будет действителен на любой платформе Windows. Номера сборки и/или пакета обновления могут включаться в значение. Значение перекрывается значением директивы OnlyBelowVersion, которая указана в секции [Setup].

Параметр, для которого не указан OnlyBelowVersion, устанавливается всегда, если только другой параметр этого не запретит.

Например:
Код:

OnlyBelowVersion: 4.1,5.0


qwea234 05-01-2014 17:00 2283386

Nordek,
Ну все спасибо большое:

выставил вот так:


Код:

Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: WINXPSP3 RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 0,6.0

первое: мы делаем для всех совместимость с RUNASADMIN
второе: мы делаем для Win 7 и Win 8 совместимость с WINXPSP3 и RUNASADMIN

получается все правильно ? или лучше в первом указать что все которые ниже Win 7 , а то получается мы делаем два параметра RUNASADMIN на win 7+..

Nordek 05-01-2014 17:32 2283401

Цитата:

Цитата qwea234
или лучше в первом указать что все которые »

Ну, первой можешь назначить MinVersion и OnlyBelowVersion

; MinVersion: 4.0,; OnlyBelowVersion: 0,6.0 т.е начиная от Windows 95 и заканчивая Windows Vista, на Vista уже не сработает/не внесётся параметр в реестр.
далее у тебя идёт второй параметр MinVersion: 0,6.0 что значит сработает начиная от Windows Vista и выше, но не будет работать на ранних версиях - т.е на XP уже не сработает/не внесётся параметр в реестр.

Код:

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 4.0,; OnlyBelowVersion: 0,6.0
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: WINXPSP3 RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 0,6.0


qwea234 05-01-2014 17:35 2283404

Nordek, Блин чел, Вы такой умный - спасибо =)

все скопировал что вы мне дали, буду тестировать, как я понял с этими параметрами в реестр, уже не надо ничего добавлять в секцию: [Setup] ?
а то вы выше писали что возможно туда придется добавлять..


Добавлено:
выдало ошибки при компиляции на MinVersion: 4.0,;
Вы видать забыли 0 дописать, типо

MinVersion: 4.0,0; ? - или просто запятая лишняя..


Добавлено:
Попытался на "Windows 2003 Server" проверить совместимость - почему то не выставило, видать NT уже идет ?

Nordek 05-01-2014 18:28 2283435

Весь список MinVersion для справки:
Код:


MinVersion: 4.0,        - Windows 95

MinVersion: 4.1,        - Windows 98

MinVersion: 4.9,        - Windows ME

MinVersion: 0,4.0      - Windows NT 4.0
MinVersion: 0,4.0sp1    - Windows NT 4.0 Service Pack 1
MinVersion: 0,4.0sp2    - Windows NT 4.0 Service Pack 2
MinVersion: 0,4.0sp3    - Windows NT 4.0 Service Pack 3
MinVersion: 0,4.0sp4    - Windows NT 4.0 Service Pack 4
MinVersion: 0,4.0sp5    - Windows NT 4.0 Service Pack 5
MinVersion: 0,4.0sp6    - Windows NT 4.0 Service Pack 6

MinVersion: 0,5.0      - Windows 2000
MinVersion: 0,5.0sp1    - Windows 2000 Service Pack 1
MinVersion: 0,5.0sp2    - Windows 2000 Service Pack 2
MinVersion: 0,5.0sp3    - Windows 2000 Service Pack 3
MinVersion: 0,5.0sp4    - Windows 2000 Service Pack 4

MinVersion: 0,5.01      - Windows XP/Windows XP 64-Bit Edition Version 2002 (Itanium)
MinVersion: 0,5.01sp1  - Windows XP Service Pack 1
MinVersion: 0,5.01sp2  - Windows XP Service Pack 2
MinVersion: 0,5.01sp3  - Windows XP Service Pack 3
MinVersion: 0,5.02      - Windows XP x64 Edition (AMD/EM64T)
MinVersion: 0,5.01      - Windows XP 64-Bit Edition Version 2002 (Itanium)
MinVersion: 0,5.02      - Windows XP 64-Bit Edition Version 2003 (Itanium)

MinVersion: 0,6.0      - Windows Vista
MinVersion: 0,6.0sp1    - Windows Vista Service Pack 1
MinVersion: 0,6.0sp2    - Windows Vista Service Pack 2

MinVersion: 0,6.1      - Windows 7
MinVersion: 0,6.1sp1    - Windows 7 Service Pack 1

MinVersion: 0,5.02      - Windows Server 2003
MinVersion: 0,5.02sp1  - Windows Server 2003 Service Pack 1
MinVersion: 0,5.02sp2  - Windows Server 2003 Service Pack 2
MinVersion: 0,5.02      - Windows Server 2003 R2

MinVersion: 0,6.0      - Windows Server 2008
MinVersion: 0,6.1      - Windows Server 2008 R2

MinVersion: 0,6.2      - Windows 8

MinVersion: 0,6.3      - Windows 8.1

Примечание:
В списке могут попадаться одинаковые значения например: для Windows Vista: MinVersion: 0,6.0 и для Windows Server 2008: MinVersion: 0,6.0 - это не опечатка, просто MinVersion: 0,6.0 идёт как для Windows Vista так и Windows Server 2008.
По этому, достаточно указать один раз MinVersion: 0,6.0 - она сработает как для Windows Vista так и Windows Server 2008.

qwea234 05-01-2014 18:49 2283443

понял делаю вот так:

Код:

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 5.1,0; OnlyBelowVersion: 0,6.3
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\Tront.exe; ValueData: WINXPSP3 RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 0,6.3

первое все в том числе и WinXP и 2003

второе все что выше Vista в том числе и 2008

Optitron 05-01-2014 19:27 2283463

Nordek, Благодарю, а как убрать линии не знаете?

Nordek 05-01-2014 19:43 2283470

Цитата:

Цитата Optitron
а как убрать линии »

Какие? На скрине не понятно.
Код:

  WizardForm.ComponentsList.BorderStyle := bsNone;
Это или опять не то?

qwea234 05-01-2014 19:53 2283473

Nordek, ладно что-то не работает на 2003 все-равно, если убрать вообще минверсия - тогда работает, а с ней нет, скорей всего тогда вас не буду мучат - придется глобально почитать описание =(

Nordek 05-01-2014 20:07 2283480

Цитата:

Цитата qwea234
выдало ошибки при компиляции на MinVersion: 4.0,; »

Так у тебя наверно стандартная версия. Используй расширенную версию INNO.

qwea234 05-01-2014 20:09 2283481

Nordek, то есть это не ошибка что просто написано 4.0, - с запятой ?

Nordek 05-01-2014 20:15 2283488

Цитата:

Цитата qwea234
то есть это не ошибка что просто написано 4.0, - с запятой ? »

Нет, не ошибка. У меня на расширенной версии компилится нормально. Если б не работала, я бы не выкладывал.

Вот тестовый скрипт:
Код:

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

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

[Icons]
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe
Name: {commondesktop}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\MyProg.exe; ValueData: RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 4.0,; OnlyBelowVersion: 0,6.0
Root: HKCU; SubKey: Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers; ValueType: string; ValueName: {app}\MyProg.exe; ValueData: WINXPSP3 RUNASADMIN; Flags: uninsdeletevalue uninsdeletekeyifempty; MinVersion: 0,6.0


Nightwishh 06-01-2014 04:06 2283680

Я дико извеняюсь, хочу спросить как запустить .msi контейнер в процедуре procedure CurStepChanged(CurStep: TSetupStep)
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then begin
      Exec(ExpandConstant('{src}\Soft\PhysX-9.13.0725-SystemSoftware.msi'), 'msiexec /i', ExpandConstant('{src}\Soft'), SW_SHOW, ewWaitUntilTerminated, ResultCode);
  end;
end;

неработает!!!

Nordek 06-01-2014 05:55 2283684

Цитата:

Цитата Nightwishh
как запустить .msi »

Код:

[CustomMessages]
PhysXInstall=Установка PhysX

[Code]
var
ResultCode: integer;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if
CurStep = ssPostInstall then begin
     
WizardForm.FilenameLabel.Caption:=ExpandConstant('{cm:PhysXInstall}');
      ShellExec('', ExpandConstant('{src}\Soft\PhysX-9.13.0725-SystemSoftware.msi'),'/qn', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
  end;
end;


Nightwishh 06-01-2014 20:25 2283952

Вложений: 1
http://forum.oszone.net/attachment.p...1&d=1388942447 Такое окошко выскакивает после установки (невсегда, очень редко). Что это может озночать?

habib2302 07-01-2014 19:34 2284353

доброе время суток.помогите мне решить ошибку

vint56 07-01-2014 19:41 2284358

habib2302
const
LOAD_LIBRARY_AS_DATAFILE = $2;

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle;
external 'LoadLibraryExA@kernel32.dll stdcall';habib2302,

Ivan_009 07-01-2014 20:42 2284398

Почему при нехватке места на диске при нажатии кнопки далее инсталл тупо предлагает выйти не пойму в чем проблема вот код... Заранее спасибо за помощь...

Код:

var
BmpFile: TBitmapImage;
ISCustomPage1: TWizardPage;
Panel1,Panel2: TPanel;
StatusLabel1,StatusLabel2,StatusLabel3,StatusLabel4,StatusLabel5,StatusLabel6: TLabel;
Bevel2: TBevel;
DirBevel,GroupBevel,DriveBevel: TBevel;
TotalSpaceLabel, FreeSpaceLabel, NeedSpacelabel, InstallSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal;
Label1: TLabel;
///
const
NORMAL_PRIORITY_CLASS          = $00000020;
IDLE_PRIORITY_CLASS            = $00000040;
HIGH_PRIORITY_CLASS            = $00000080;
REALTIME_PRIORITY_CLASS        = $00000100;

function SetPriorityClass(hProcess: THandle; dwPriorityClass: DWORD): BOOL;
  external 'SetPriorityClass@kernel32';

function GetCurrentProcess: THandle;
  external 'GetCurrentProcess@kernel32';
///
///
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.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 MbOrTb(Float: Extended): String;
begin
  if Float < 1024 then Result:= NumToStr(Float)+' Ìá' else
    if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Ãá' else
      Result:= NumToStr(Float/(1024*1024))+' Òá';
end;

procedure DirEditOnChange(Sender: TObject);
var Drive: String;
begin
  Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
  TotalSpaceLabel.Caption := ExpandConstant('{cm:TotalSpaceLabel} ')+MbOrTb(TotalMB);
  FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSpaceLabel} ')+MbOrTb(FreeMB)+' ('+IntToStr(round(FreeMB*100/TotalMB))+'%)';
  InstallSpacelabel.Caption := ExpandConstant('{cm:InstallSpacelabel} ')+MbOrTb({#NeedInstallSize});
  NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpaceLabel} ')+MbOrTb({#NeedSize});
  WizardForm.NextButton.Enabled:= (FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize})  ;
end;

procedure InitializeWizard();
begin
WizardForm.Width:=ScaleX(586);
WizardForm.Height:=ScaleY(438);
WizardForm.Position:=poScreenCenter;
WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
//WizardForm.Color:=clMenu;
///
SetPriorityClass(GetCurrentProcess, IDLE_PRIORITY_CLASS);    //óñòàíîâêà ïðèîðèòåòà äëÿ èíñòàëëÿòîðà.
///
ExtractTemporaryFile('Welcome.bmp')
ExtractTemporaryFile('Finished.bmp')

BmpFile:= TBitmapImage.Create(WizardForm)
BmpFile.Stretch:= True;
BmpFile.SetBounds(ScaleX(1),ScaleY(49), ScaleX(578), ScaleY(311))
BmpFile.Parent:= WizardForm;

with WizardForm.NextButton do
begin
Parent:=WizardForm;
Left := ScaleX(460);
Top := ScaleY(372);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.CancelButton do
begin
Parent:=WizardForm;
Left := ScaleX(460);
Top := ScaleY(372);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.BackButton do
begin
Parent:=WizardForm;
Left := ScaleX(343);
Top := ScaleY(372);
Width := ScaleX(110);
Height := ScaleY(30);
end;

// Panel
Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
Parent := WizardForm;
Left := ScaleX(20);
Top := ScaleY(69);
Width := ScaleX(541);
Height := ScaleY(261);
end;

Panel2 := TPanel.Create(WizardForm);
with Panel2 do
begin
Parent := Panel1;
Left := ScaleX(22);
Top := ScaleY(25);
Width := ScaleX(496);
Height := ScaleY(214);
end;

with WizardForm.ProgressGauge do
begin
Left := ScaleX(55);
Top := ScaleY(375);
Width := ScaleX(390);
Height := ScaleY(25);
Parent:= WizardForm;
end;

with WizardForm.ComponentsList do
begin
Parent:=Panel2;
Width := ScaleX(465);
Left := ScaleX(15);
Top := ScaleY(15);
Height := ScaleY(183);
end;

with WizardForm.ReadyMemo do
begin
Left := ScaleX(13);
Top := ScaleY(5);
Width := ScaleX(470);
Height := ScaleY(193);
Parent:=Panel2;
end;

// Bevel
with WizardForm.Bevel1 do
begin
Parent:=WizardForm;
Left := ScaleX(1);
Top := ScaleY(47);
Width := ScaleX(578);
Height := ScaleY(2);
end;

Bevel2 := TBevel.Create(WizardForm);
with Bevel2 do
begin
Parent := Panel1;
Left := ScaleX(10);
Top := ScaleY(11);
Width := ScaleX(520);
Height := ScaleY(240);
end;

with WizardForm.Bevel do
begin
Parent:=WizardForm;
Left := ScaleX(1);
Top := ScaleY(361);
Width := ScaleX(578);
Height := ScaleY(2);
end;

DirBevel := TBevel.Create(WizardForm);
with DirBevel do
begin
Parent := Panel1;
Left := ScaleX(22);
Top := ScaleY(25);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

GroupBevel := TBevel.Create(WizardForm);
with GroupBevel do
begin
Parent := Panel1;
Left := ScaleX(22);
Top := ScaleY(100);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

DriveBevel := TBevel.Create(WizardForm);
with DriveBevel do
begin
Parent := Panel1;
Left := ScaleX(22);
Top := ScaleY(177);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

with WizardForm.DirBrowseButton do
begin
Parent:=Panel1;
Left := ScaleX(395);
Top := ScaleY(37);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.DirEdit do
begin
Parent:=Panel1;
Left := ScaleX(43);
Top := ScaleY(42);
Width := ScaleX(330);
Height := ScaleY(25);
end;

with WizardForm.GroupBrowseButton do
begin
Parent:=Panel1;
Left := ScaleX(395);
Top := ScaleY(115);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.GroupEdit do
begin
Parent:=Panel1;
Left := ScaleX(43);
Top := ScaleY(120);
Width := ScaleX(330);
Height := ScaleY(25);
end;

// Label
TotalSpaceLabel:= TLabel.Create(WizardForm);
TotalSpaceLabel.AutoSize:= False;
TotalSpaceLabel.SetBounds(40, 195, 200, 20);
TotalSpaceLabel.Parent:= Panel1;

FreeSpaceLabel:= TLabel.Create(WizardForm);
FreeSpaceLabel.AutoSize:= False;
FreeSpaceLabel.SetBounds(40, 215, 200, 20);
FreeSpaceLabel.Parent:= Panel1;

InstallSpacelabel:= TLabel.Create(WizardForm);
InstallSpacelabel.AutoSize:= False;
InstallSpacelabel.SetBounds(285, 195, 200, 20);
InstallSpacelabel.Parent:= Panel1;

NeedSpaceLabel:= TLabel.Create(WizardForm);
NeedSpaceLabel.AutoSize:= False;
NeedSpaceLabel.SetBounds(285, 215, 200, 20);
NeedSpaceLabel.Parent:= Panel1;

WizardForm.DirEdit.OnChange:=@DirEditOnChange;

StatusLabel1:= TLabel.Create(WizardForm);
with StatusLabel1 do
begin
Parent:=WizardForm;
Left := ScaleX(20);
Top := ScaleY(5);
Width := ScaleX(578);
Height := ScaleY(20);
Font.Name:='Tahoma';
Font.Size:= 10;
Font.Style:=[fsBold];
end;

StatusLabel2:= TLabel.Create(WizardForm);
with StatusLabel2 do
begin
Parent:=WizardForm;
Left := ScaleX(32);
Top := ScaleY(25);
Width := ScaleX(578);
Height := ScaleY(20);
Font.Name:='Tahoma';
Font.Size:= 8;
end;

StatusLabel3:= TLabel.Create(WizardForm);
with StatusLabel3 do
begin
Parent := Panel1;
Left := ScaleX(43);
Top := ScaleY(18);
Width := ScaleX(496);
Height := ScaleY(20);
Font.Name:='Tahoma';
Font.Size:= 10;
end;

StatusLabel4:= TLabel.Create(WizardForm);
with StatusLabel4 do
begin
Parent := Panel1;
Left := ScaleX(43);
Top := ScaleY(92);
Width := ScaleX(496);
Height := ScaleY(20);
Font.Name:='Tahoma';
Font.Size:= 10;
end;

StatusLabel5:= TLabel.Create(WizardForm);
with StatusLabel5 do
begin
Parent := Panel1;
Left := ScaleX(43);
Top := ScaleY(170);
Width := ScaleX(496);
Height := ScaleY(20);
Font.Name:='Tahoma';
Font.Size:= 10;
end;

StatusLabel6 := TLabel.Create(WizardForm);
with StatusLabel6 do
begin
Parent := WizardForm;
Left := ScaleX(37);
Top := ScaleY(337);
Width := ScaleX(178);
Height := ScaleY(13);
end;
end;

// Ïðîïóñê ñòðàíèö
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID =wpLicense)or(PageID =wpInfoBefore)or(PageID =wpUserInfo)or(PageID =wpSelectProgramGroup)or(PageID =wpSelectTasks) then
  Result:= True;
end;

procedure ShowComponents(CurPageID: Integer);
begin
Panel1.Show;
Panel2.Show;
BmpFile.Hide;
StatusLabel3.Hide;
StatusLabel4.Hide;
StatusLabel5.Hide;
StatusLabel6.Hide;
WizardForm.DirBrowseButton.Hide;
WizardForm.DirEdit.Hide;
WizardForm.GroupBrowseButton.Hide;
WizardForm.GroupEdit.Hide;
TotalSpaceLabel.Hide;
FreeSpaceLabel.Hide;
InstallSpacelabel.Hide;
NeedSpaceLabel.Hide;
WizardForm.ProgressGauge.Hide;
Case CurPageID of
wpWelcome:
begin
StatusLabel1.Caption:= ExpandConstant('{cm:Welcome1}')
StatusLabel2.Caption:= ExpandConstant('{cm:Welcome2}')
WizardForm.NextButton.Caption := 'Äàëåå »';
Panel1.Hide;
BmpFile.Show;
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Welcome.bmp'))
end;
wpSelectDir:
begin
DirEditOnChange(nil)
Panel2.Hide;
StatusLabel3.Show;
StatusLabel4.Show;
StatusLabel5.Show;
StatusLabel6.Show;
WizardForm.DirBrowseButton.Show;
WizardForm.DirEdit.Show;
WizardForm.GroupBrowseButton.Show;
WizardForm.GroupEdit.Show;
TotalSpaceLabel.Show;
FreeSpaceLabel.Show;
InstallSpacelabel.Show;
NeedSpaceLabel.Show;
WizardForm.ComponentsList.Hide;
WizardForm.ReadyMemo.Hide;
StatusLabel1.Caption:= ExpandConstant('{cm:Select1}')
StatusLabel2.Caption:= ExpandConstant('{cm:Select2}')
StatusLabel3.Caption:= ExpandConstant('{cm:Select3}')
StatusLabel4.Caption:= ExpandConstant('{cm:Select4}')
StatusLabel5.Caption:= ExpandConstant('{cm:Select5}')
StatusLabel6.Caption:= ExpandConstant('{cm:Select6}')
WizardForm.NextButton.Caption := 'Äàëåå »';
WizardForm.BackButton.Caption := '« Íàçàä';
end;
wpSelectComponents:
begin
WizardForm.ComponentsList.Show;
WizardForm.ReadyMemo.Hide;
StatusLabel6.Show;
StatusLabel1.Caption:= ExpandConstant('{cm:Select7}')
StatusLabel2.Caption:= ExpandConstant('{cm:Select8}')
StatusLabel6.Caption:= ExpandConstant('{cm:Select9}')
WizardForm.NextButton.Caption := 'Äàëåå »';
WizardForm.BackButton.Caption := '« Íàçàä';
end;
wpReady:
begin
WizardForm.ComponentsList.Hide;
WizardForm.ReadyMemo.Show;
StatusLabel6.Show;
StatusLabel1.Caption:= ExpandConstant('{cm:Select10}')
StatusLabel2.Caption:= ExpandConstant('{cm:Select11}')
StatusLabel6.Caption:= ExpandConstant('{cm:Select12}')
WizardForm.NextButton.Caption:= 'Óñòàíîâèòü';
WizardForm.BackButton.Caption := '« Íàçàä';
end;
wpInstalling:
begin
WizardForm.TasksList.Hide;
WizardForm.ReadyMemo.Hide;
StatusLabel6.Hide;
StatusLabel1.Caption:= ExpandConstant('{cm:Select13}')
StatusLabel2.Caption:= ExpandConstant('{cm:Select14}')
WizardForm.ProgressGauge.Show;
end;
wpFinished:
begin
Panel1.Hide;
BmpFile.Show;
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Finished.bmp'))
StatusLabel1.Caption:= ExpandConstant('{cm:Select15}')
StatusLabel2.Caption:= ExpandConstant('{cm:Select16}')
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ShowComponents(CurPageID);
end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Skin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;


nik1967 07-01-2014 21:47 2284424

Цитата:

Цитата Ivan_009
Почему при нехватке места на диске при нажатии кнопки далее инсталл тупо предлагает выйти »

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

with WizardForm.NextButton do
begin
Parent:=WizardForm;
Left := ScaleX(460);
Top := ScaleY(372);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.CancelButton do
begin
Parent:=WizardForm;
Left := ScaleX(460);
Top := ScaleY(372);
Width := ScaleX(110);
Height := ScaleY(30);
end;


У тебя CancelButton накладывается на NextButton. Соответственно при неактивной кнопке NextButton вместо неё нажимается CancelButton.

Ivan_009 09-01-2014 20:26 2285644

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

Код:

var
SettingPanel : TPanel;
Flag : boolean;
Timer : LongWord;
DirBevel,GroupBevel,DriveBevel: TBevel;

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:='Íàñòðîéêè';
False : TButton(Sender).Caption:='Íàçàä';
end;
Flag:= not Flag;
end;

procedure InitializeWizard();
begin
Flag:= False;

WizardForm.Width:=ScaleX(700);
WizardForm.Height:=ScaleY(400);
WizardForm.Position:=poScreenCenter;
WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.Color:=$000000;

SettingPanel := TPanel.Create(WizardForm);
with SettingPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
ParentBackground := False;
SettingPanel.Color:=$000000;
end;

with WizardForm.DirBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(37);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.DirEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(42);
Width := ScaleX(330);
Height := ScaleY(25);
end;

with WizardForm.GroupBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(115);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.GroupEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(120);
Width := ScaleX(330);
Height := ScaleY(25);
end;

DirBevel := TBevel.Create(WizardForm);
with DirBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(25);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

GroupBevel := TBevel.Create(WizardForm);
with GroupBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(100);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

DriveBevel := TBevel.Create(WizardForm);
with DriveBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(177);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

(*with WizardForm.ProgressGauge do
begin
Left := ScaleX(75);
Top := ScaleY(160);
Width := ScaleX(430);
Height := ScaleY(25);
Parent:= WizardForm;
end;*)

with TButton.Create(WizardForm) do
begin
OnClick:= @HideShow;
SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY (25))
Caption:='Íàñòðîéêè';
Parent:= WizardForm;
end;
end;


Nordek 09-01-2014 21:03 2285657

Цитата:

Цитата Ivan_009
Помогите растянуть панель при задвижении и выкате на всю форму вот код »

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

[Code]
var
SettingPanel : TPanel;
Flag : boolean;
Timer : LongWord;
DirBevel,GroupBevel,DriveBevel: TBevel;

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:='Iano?ieee';
False : TButton(Sender).Caption:='Iacaa';
end;
Flag:= not Flag;
end;

procedure InitializeWizard();
begin
Flag:= False;

WizardForm.Width:=ScaleX(700);
WizardForm.Height:=ScaleY(400);
WizardForm.Position:=poScreenCenter;
WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.Color:=$000000;

WizardForm.Bevel.Width := ScaleX(695);
//WizardForm.Bevel.Visible := False;  // äëÿ òîãî ÷òîá ñêðûòü Bevel, ðàñêîìåíòèðóé  "WizardForm.Bevel.Visible := False;" è çàêîìåíòèðóé "WizardForm.Bevel.Width := ScaleX(695);"

SettingPanel := TPanel.Create(WizardForm);
with SettingPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(7),ScaleY(-315),ScaleX(680),ScaleY(313));
ParentBackground := False;
SettingPanel.Color:=$000000;
end;

with WizardForm.DirBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(37);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.DirEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(42);
Width := ScaleX(330);
Height := ScaleY(25);
end;

with WizardForm.GroupBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(115);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.GroupEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(120);
Width := ScaleX(330);
Height := ScaleY(25);
end;

DirBevel := TBevel.Create(WizardForm);
with DirBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(25);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

GroupBevel := TBevel.Create(WizardForm);
with GroupBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(100);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

DriveBevel := TBevel.Create(WizardForm);
with DriveBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(177);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

(*with WizardForm.ProgressGauge do
begin
Left := ScaleX(75);
Top := ScaleY(160);
Width := ScaleX(430);
Height := ScaleY(25);
Parent:= WizardForm;
end;*)

with TButton.Create(WizardForm) do
begin
OnClick:= @HideShow;
SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY (25))
Caption:='Iano?ieee';
Parent:= WizardForm;
end;
end;


Ivan_009 09-01-2014 22:18 2285703

Как скрыть TButton на wpInstalling: пробовал TButton.Hide; не работает

Код:

var
SettingPanel : TPanel;
Flag : boolean;
Timer : LongWord;
BmpFile: TBitmapImage;
DirBevel,GroupBevel,DriveBevel: TBevel;

//Skin
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
//Skin

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:='Íàñòðîéêè';
False : TButton(Sender).Caption:='Íàçàä';
end;
Flag:= not Flag;
end;

procedure InitializeWizard();
begin
Flag:= False;

WizardForm.Width:=ScaleX(700);
WizardForm.Height:=ScaleY(400);
WizardForm.Position:=poScreenCenter;
WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.Bevel.Width := ScaleX(695);
//WizardForm.Color:=$000000;

ExtractTemporaryFile('WizardImage.bmp')
//ExtractTemporaryFile('Finished.bmp')
//ExtractTemporaryFile('CBImg.bmp');

BmpFile:= TBitmapImage.Create(WizardForm)
BmpFile.Stretch:= True;
BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(700), ScaleY(313))
BmpFile.Parent:= WizardForm;

with WizardForm.NextButton do
begin
Parent:=WizardForm;
Left := ScaleX(460);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.CancelButton do
begin
Parent:=WizardForm;
Left := ScaleX(9);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.BackButton do
begin
Parent:=WizardForm;
Left := ScaleX(343);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
end;

SettingPanel := TPanel.Create(WizardForm);
with SettingPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0),ScaleY(-315),ScaleX(694),ScaleY(313));
ParentBackground := False;
//SettingPanel.Color:=$000000;
end;

with WizardForm.DirBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(37);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.DirEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(42);
Width := ScaleX(330);
Height := ScaleY(25);
end;

with WizardForm.GroupBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(115);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.GroupEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(120);
Width := ScaleX(330);
Height := ScaleY(25);
end;

DirBevel := TBevel.Create(WizardForm);
with DirBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(25);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

GroupBevel := TBevel.Create(WizardForm);
with GroupBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(100);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

DriveBevel := TBevel.Create(WizardForm);
with DriveBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(177);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

with WizardForm.ProgressGauge do
begin
Left := ScaleX(75);
Top := ScaleY(160);
Width := ScaleX(430);
Height := ScaleY(25);
Parent:= WizardForm;
end;

with TButton.Create(WizardForm) do
begin
OnClick:= @HideShow;
Left := ScaleX(10);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
Caption:='Íàñòðîéêè';
Parent:= WizardForm;
end;
end;

//Óáèðàåì âñå ñòðàíèöû êðîìå WelcomePage
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID =wpLicense)or(PageID =wpInfoBefore)or(PageID =wpUserInfo)or(PageID =wpSelectDir)or(PageID =wpSelectComponents)or(PageID =wpSelectProgramGroup)or(PageID =wpSelectTasks)or(PageID =wpReady)then
  Result:= True;
end;

procedure ShowComponents(CurPageID: Integer);
begin
WizardForm.ProgressGauge.Hide;
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage.bmp'))
Case CurPageID of
wpWelcome:
begin
WizardForm.NextButton.Caption := 'Íà÷àòü óñòàíîâêó';
end;
wpInstalling:
begin
SettingPanel.Hide;
WizardForm.ProgressGauge.Show;
end;
wpFinished:
begin

end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ShowComponents(CurPageID);
end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Skin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result:= true
end;

function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'),
ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\Skin.cjstyles'),
ExpandConstant('{tmp}\Skin.cjstyles'), False); LoadSkinU(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result:=True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;

procedure DeinitializeUninstall();
begin
UnloadSkinU();
end;


saurn 09-01-2014 23:13 2285726

Цитата:

Цитата Ivan_009
Как скрыть TButton на wpInstalling »

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

var
SettingPanel : TPanel;
Flag : boolean;
Timer : LongWord;
BmpFile: TBitmapImage;
DirBevel,GroupBevel,DriveBevel: TBevel;
CustomBtn: TButton;

//Skin
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
//Skin

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:='I'a`n~o`?i^e'e^e`';
False : TButton(Sender).Caption:='I'a`c,a`a"';
end;
Flag:= not Flag;
end;

procedure InitializeWizard();
begin
Flag:= False;

WizardForm.Width:=ScaleX(700);
WizardForm.Height:=ScaleY(400);
WizardForm.Position:=poScreenCenter;
WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.Bevel.Width := ScaleX(695);
//WizardForm.Color:=$000000;

ExtractTemporaryFile('WizardImage.bmp')
//ExtractTemporaryFile('Finished.bmp')
//ExtractTemporaryFile('CBImg.bmp');

BmpFile:= TBitmapImage.Create(WizardForm)
BmpFile.Stretch:= True;
BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(700), ScaleY(313))
BmpFile.Parent:= WizardForm;

with WizardForm.NextButton do
begin
Parent:=WizardForm;
Left := ScaleX(460);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.CancelButton do
begin
Parent:=WizardForm;
Left := ScaleX(9);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.BackButton do
begin
Parent:=WizardForm;
Left := ScaleX(343);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
end;

SettingPanel := TPanel.Create(WizardForm);
with SettingPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0),ScaleY(-315),ScaleX(694),ScaleY(313));
ParentBackground := False;
//SettingPanel.Color:=$000000;
end;

with WizardForm.DirBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(37);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.DirEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(42);
Width := ScaleX(330);
Height := ScaleY(25);
end;

with WizardForm.GroupBrowseButton do
begin
Parent:=SettingPanel;
Left := ScaleX(395);
Top := ScaleY(115);
Width := ScaleX(110);
Height := ScaleY(30);
end;

with WizardForm.GroupEdit do
begin
Parent:=SettingPanel;
Left := ScaleX(43);
Top := ScaleY(120);
Width := ScaleX(330);
Height := ScaleY(25);
end;

DirBevel := TBevel.Create(WizardForm);
with DirBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(25);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

GroupBevel := TBevel.Create(WizardForm);
with GroupBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(100);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

DriveBevel := TBevel.Create(WizardForm);
with DriveBevel do
begin
Parent := SettingPanel;
Left := ScaleX(22);
Top := ScaleY(177);
Width := ScaleX(496);
Height := ScaleY(62);
Style := bsRaised;
end;

with WizardForm.ProgressGauge do
begin
Left := ScaleX(75);
Top := ScaleY(160);
Width := ScaleX(430);
Height := ScaleY(25);
Parent:= WizardForm;
end;

CustomBtn := TButton.Create(WizardForm);
with CustomBtn do
begin
OnClick:= @HideShow;
Left := ScaleX(10);
Top := ScaleY(330);
Width := ScaleX(110);
Height := ScaleY(30);
Caption:='I'a`n~o`?i^e'e^e`';
Parent:= WizardForm;
end;
end;

//O'a'e`?a`a*i` a^n~a* n~o`?a`i'e`o"u^ e^?i^i`a* WelcomePage
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if
(PageID =wpLicense)or(PageID =wpInfoBefore)or(PageID =wpUserInfo)or(PageID =wpSelectDir)or(PageID =wpSelectComponents)or(PageID =wpSelectProgramGroup)or(PageID =wpSelectTasks)or(PageID =wpReady)then
 
Result:= True;
end;

procedure ShowComponents(CurPageID: Integer);
begin
WizardForm.ProgressGauge.Hide;
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage.bmp'))
Case CurPageID of
wpWelcome:
begin
WizardForm.NextButton.Caption := 'I'a`?a`o`u" o'n~o`a`i'i^a^e^o'';
end;
wpInstalling:
begin
CustomBtn.Hide;
SettingPanel.Hide;
WizardForm.ProgressGauge.Show;
end;
wpFinished:
begin

end
;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ShowComponents(CurPageID);
end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Skin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result:= true
end;

function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'),
ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\Skin.cjstyles'),
ExpandConstant('{tmp}\Skin.cjstyles'), False); LoadSkinU(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result:=True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;

procedure DeinitializeUninstall();
begin
UnloadSkinU();
end;


Ivan_009 10-01-2014 14:13 2286013

Как наложить изображение bmp на форму выхода. Подскажите кто знает. Зарание спасибо.

diman_21Ru 10-01-2014 16:47 2286108

Всем привет не кто не знает почему эта ошибка при запуске уже готового скрипта по системным требованиям

Gnom_aka_Lexander 10-01-2014 18:41 2286226

diman_21Ru, точку с запятой на предыдущей строке забыл. и таких ошибок скорей всего будет еще тьма. плюс скорей всего в паре мест вылезет несоответствие типов string и ansistring (проверено, гарантирую) поэтому есть смысл тебе пользоваться ansi-версией, к юникодной ты точно не готов (иначе этого вопроса не было-бы)

diman_21Ru 10-01-2014 19:10 2286234

а где найти ansi-версию и какую надо именно ?

5.5.1 стоит расширенная на ней ошибку выдает (

Gnom_aka_Lexander 10-01-2014 19:16 2286238

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

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

diman_21Ru 10-01-2014 19:18 2286241

спасибо

Ivan_009 11-01-2014 21:59 2287062

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

Вот код

Код:

type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

const
  PCFonFLY=true;
  notPCFonFLY=false;

  GWL_STYLE = -16;

  WS_MINIMIZEBOX = $20000;
  WS_MAXIMIZEBOX = $10000;

var
  LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
  ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
  LabelPct2: TLabel;
  ISDoneProgressBar2:TNewProgressBar;
#endif
  ISDoneCancel:integer;
  ISDoneError:boolean;
  PCFVer:double;

  BmpFile: TBitmapImage;
  about: TNewButton;

  pfunc: LongWord;
  TimerID: LongWord;
  intOldCurrWidth : Integer;
  ProgressBar_BitmapImage: TBitmapImage;
  ProgressBar_Edit : TEdit;
  ProgressBar_ImageHeight : integer;

procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

// Ôóíêöèè äëÿ ðàáîòû ñ òàéìåðîì
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 SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

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 WizardForm.ProgressGauge.Position := OveralPct;
  Result := ISDoneCancel;
end;

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

procedure AboutClick(Sender: TObject);
begin
  MessageBox(WizardForm.Handle, '{#Release}', 'Î ðåëèçå', MB_OK or MB_ICONINFORMATION);
end;

// Ôóíêöèÿ âûçûâàåìàÿ ïî òàéìåðó
procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
    CurrWidth : single;
begin
    // Èñïîëüçóåì òåêóùåå ñîñòîÿíèå ñòàíäàðòíîãî Ïðîãðåññ Áàðà (ÏÁ)
    with WizardForm.ProgressGauge do
    begin
        CurrWidth := ( Position * ScaleX(430) ) / Max;            // Âû÷èñëÿåì êàêîé øèðèíû äîëæåí áûòü íàø ÏÁ
        if intOldCurrWidth <> Round( CurrWidth ) then      // Åñëè øèðèíà ïîêà ÷òî òàêàÿ æå, òî íå áóäåì ïîêà ÷òî ðèñîâàòü, ÷òîáû èçáåæàòü ëèøíèõ îáíîâëåíèé ôîðìû
        begin
            intOldCurrWidth := Round( CurrWidth );
            // Òåïåðè÷à "ðèñóåì" íàø ÏÁ
            ProgressBar_BitmapImage.SetBounds( 0, 0, intOldCurrWidth, ProgressBar_ImageHeight );
            ProgressBar_BitmapImage.Show();                    // Ïîêàçûâàåì åãî âî âñåé êðàñå
        end;
    end;
end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('Skin.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
  Result:= true
end;

procedure HideControls;
begin
  WizardForm.FileNamelabel.Hide;
  ISDoneProgressBar1.Hide;
  LabelPct1.Hide;
  LabelCurrFileName.Hide;
  LabelTime1.Hide;
  LabelTime2.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;
 end;

procedure InitializeWizard();
begin
  WizardForm.Width:=ScaleX(654);
  WizardForm.Height:=ScaleY(423);
  WizardForm.Position:=poScreenCenter;
  WizardForm.InnerNotebook.Hide;
  WizardForm.OuterNotebook.Hide;
  WizardForm.Color:=$000000;

SetWindowLong(WizardForm.handle, GWL_STYLE, GetWindowLong(WizardForm.handle, GWL_STYLE)and(not WS_MINIMIZEBOX)and(not WS_MAXIMIZEBOX));
SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000);

  ExtractTemporaryFile('Welcome.bmp');
  ExtractTemporaryFile('Finished.bmp');
  ExtractTemporaryFile('{#PB_ImageFile}');

  BmpFile:= TBitmapImage.Create(WizardForm)
  BmpFile.Stretch:= True;
  BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(654), ScaleY(355))
  BmpFile.Parent:= WizardForm;

with WizardForm.Bevel do
begin
  Parent:=WizardForm;
  Left := ScaleX(0);
  Top := ScaleY(355);
  Width := ScaleX(654);
  Height := ScaleY(2);
end;

with WizardForm.NextButton do
begin
  Parent:=WizardForm;
  Left := ScaleX(450);
  Top := ScaleY(365);
  Width := ScaleX(95);
  Height := ScaleY(25);
end;

with WizardForm.CancelButton do
begin
  Parent:=WizardForm;
  Left := ScaleX(550);
  Top := ScaleY(365);
  Width := ScaleX(95);
  Height := ScaleY(25);
end;

with WizardForm.BackButton do
begin
  Parent:=WizardForm;
  Left := ScaleX(350);
  Top := ScaleY(365);
  Width := ScaleX(95);
  Height := ScaleY(25);
end;

About := TNewButton.Create(WizardForm);
with About do
begin
  Parent := WizardForm;
  Left := ScaleX(3);
  Top := ScaleY(365);
  Width := ScaleX(95);
  Height := ScaleY(25);
  Caption := 'Î ðåëèçå';
  OnClick := @AboutClick;
end;

// Ñîçäàåì íàø Edit, ÷òîáû ó íàøåãî ÏÁ áûëà áîëåå-ìåíåå íîðìàëüíàÿ ðàìêà.
    ProgressBar_Edit := TEdit.Create( WizardForm );
    with ProgressBar_Edit do
    begin
        // Ñîçäàåì åãî íà ìåñòå ñòàíäàðòíîãî ÏÁ
        Left := ScaleX(115);
        Top := ScaleY(367);
        Width := ScaleX(430);
        Height := ScaleY(21);
        Enabled := False;
        ReadOnly := True;
        // Ôîíîâûé öâåò äåëàåì òî÷íî òàêîé æå êàê ó ôîðìû.
        Color := $000000;
        Parent := WizardForm;
    end;

    ProgressBar_BitmapImage := TBitmapImage.Create( WizardForm );
    with ProgressBar_BitmapImage do
    begin
        // Çàãðóæàåì êàðòèíêó
        Bitmap.LoadFromFile( ExpandConstant( '{tmp}\' ) + '{#PB_ImageFile}' );
        Parent := ProgressBar_Edit;
        Stretch := True;        // Îí äîëæåí ðàñòÿãèâàòüñÿ
        Hide;                  // Ïðÿ÷åì åãî äî ïîðû äî âðåìåíè
    end;

    // Ïîëó÷àåì âûñîòó äëÿ êàðòèíêè
    ProgressBar_ImageHeight := ProgressBar_Edit.Height - 2;
    // Ïðÿ÷åì ñòàíäàðòíûé ÏÁ
    WizardForm.ProgressGauge.Hide;
end;

procedure ShowComponents(CurPageID: Integer);
//var
 // pfunc: LongWord;
begin
  BmpFile.Hide;
  ProgressBar_Edit.Hide;
Case CurPageID of
wpWelcome:
begin

  BmpFile.Show;
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Welcome.bmp'))
end;
wpSelectDir:
begin

end;
wpSelectComponents:
begin

end;
wpReady:
begin

end;
wpInstalling:
begin
  BmpFile.Show;
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Welcome.bmp'))
  About.Hide;
  ProgressBar_Edit.Show;
  // Óñòàíàâëèâàåì òàéìåð
  //pfunc := WrapTimerProc( @OnTimer, 4 );
  //TimerID := SetTimer( 0, 0, 100, pfunc );
  //intOldCurrWidth := 0;
end;
wpFinished:
begin
  About.Hide;
  BmpFile.Show;
  WizardForm.NextButton.Left := ScaleX(550);
  BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Finished.bmp'))
  KillTimer( 0, TimerID );
end;
end;
end;

Procedure UnpackingISDoneFinished(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 UnpackingISDone(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
    // Óñòàíàâëèâàåì òàéìåð
    pfunc := WrapTimerProc( @OnTimer, 4 );
    TimerID := SetTimer( 0, 0, 100, pfunc );
    intOldCurrWidth := 0;

    //WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.OnClick:=@CancelButtonOnClick;
    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, 'kis', '', 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 CurStepChanged(CurStep: TSetupStep);
begin
UnpackingISDone(CurStep); // IsDone Ðàñïàêîâêà àðõèâîâ
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  ShowComponents(CurPageID);
  UnpackingISDoneFinished(CurPageID); // IsDone Çàâåðøåíèå ðàñïàêîâêè
end;

procedure DeinitializeSetup();
begin
  UnloadSkin();
  KillTimer( 0, TimerID );
end;


Олег_Чернявский@vk 13-01-2014 00:39 2288003

Помогите ! ! ! Зашёл в тупик не могу добавить шрифты в инстолятор

читать дальше »
#define GameID "{5F05CE9B-7768-490E-9A71-C6R92B4EX123}" ;Ид инстолятора
#define MyAppName "DRZLoy Mod Pack 0.8.10" ;Название инстоллятора
#define MyInfoVer "1.0" ;Версия инсталлятора
#define MyAppVer "8.0.10" ;Версия игры
#define MyAppPublisher "DRZLoy" ;Имя компании или человека кто делал
#define MyAppURL "http://drzloywot.blogspot.com/" ;Ссылка для лого

;#include "Components.iss" ;Компаненты, они же моды
#include "Messages.iss" ;Сообщение, надписи на кнопках и т.д.

[Types]
Name: custom; Description: Full installation; Flags: iscustom

[Components]
Name: KMP; Description: DRZLoy Mod Pack; Types: custom; Flags: fixed
Name: KMP\X; Description: 1. XVM.;
Name: KMP\X\P; Description: а. Полная версия XVM; Flags: checkablealone ;
Name: KMP\X\L; Description: б. Без оленимера, версия XVM ; Flags: checkablealone ;
Name: KMP\Z; Description: 2. Модификация звуком.;
Name: KMP\Z\L; Description: a. Озвучка лампочки.;
Name: KMP\Z\G; Description: b. Озвучка перезарядки .;
Name: KMP\H; Description: 3. Модификация моделей танков .;
Name: KMP\H\T; Description: a. Серые трупы танков .; Flags: checkablealone ;
Name: KMP\P; Description: 4.Яркие платформы .;
Name: KMP\4; Description: 5.Часы .;
Name: KMP\I; Description: 6.Иконки в Ушах .;
Name: KMP\D; Description: 7.Отключение дерганья в динамической камере.;
Name: KMP\ZO; Description: 8.Многопозиционный снайперский режим.;
Name: KMP\N; Description: 9.Настраиваемое боевое меню.;
Name: KMP\K; Description: 10.Кто и чем по вам стреляли .;
Name: KMP\S; Description: 11.Блокировка выстрела по союзнику и трупам.;
Name: KMP\ZAS; Description: 12.Уведомление союзников о засвете.;
Name: KMP\PD; Description: 13.Боевой интефейс от Zayaz.;
Name: KMP\T; Description: 14.Расширенные подсказки к умениям и навыкам танкового экипажа.;


[Setup]
AppId={{#GameID}
AppName={#MyAppName}
AppVersion={#MyAppVer}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}

//====={ Ссылки }=====\\
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}

//====={ Папка устанвки }=====\\
;DefaultDirName={pf}\{#MyAppName}
DefaultDirName={code:MyDirName}
DefaultGroupName={#MyAppName}

//====={ Картинки }=====\\
SetupIconFile=Files\wot_ico.ico
WizardSmallImageFile=Files\img2.bmp
WizardImageFile=Files\img1.bmp

//====={ Отключение строниц }=====\\
DisableProgramGroupPage=yes

//====={ Лицензия и Фак }=====\\
LicenseFile=licensia.txt
InfoBeforeFile=faq.rtf

//====={ Папка создания и название сетапа }=====\\
OutputDir=.\Output
OutputBaseFilename=Setup

//====={ Сжатие сетапа }=====\\
InternalCompressLevel=ultra64
Compression=lzma2/ultra64
SolidCompression=true

//====={ Основные файлы сетапа }=====\\
[Files]
Source: Files\logo.bmp; Flags: dontcopy noencryption noencryption
//===БОльшая чать файлов==\\
Source: "MODS\MODI\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
//=== XVM===\\
Source: "MODS\XVM\PR\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\X\P;
Source: "MODS\XVM\L\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\X\L;

///===Модификации Звуков===\\\
Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.8.10\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\Z\L;
Source: "MODS\ZVUKI\LAMPO4KA\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\Z\L;
Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.8.10\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\Z\G;
Source: "MODS\ZVUKI\GOTOV\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\Z\G;
//===Текст====\\\
Source: "{app}\res\text\*"; DestDir: "{app}\res_mods\0.8.10\text\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\T;
Source: "MODS\TEXT\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\T;

// ====Модификации мира===\
Source: "MODS\PLAT\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\P;

//===Шкурки===\\
Source: "MODS\HKURKI\TRUP\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\H\T;
//===Всякая херь===\
Source: "MODS\4ASI\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\4;
Source: "MODS\IKON\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\I;
Source: "MODS\DIMCAM\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\D;
Source: "MODS\ZOM\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\ZO;
Source: "MODS\NASTRAMEN\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\N;
Source: "MODS\KTO\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\K;
Source: "MODS\SAFE\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\S;
Source: "MODS\ZASVET\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\ZAS;
Source: "MODS\PDEMAG\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: KMP\PD;



//====={ Выбор языка }=====\\
[Languages]
Name: "eng"; MessagesFile: "compiler:Default.isl"
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"

[code]
function MyDirName(S:String): String;
var
InsPath: String;
er: boolean;
myFile:String;
begin
Result:=ExpandConstant('C:\Games\World_of_Tanks\'); //если ключа нет то будем ставить сюда
er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath);
if er and (InsPath<>'') then //если ключ существует и там что-то записано
begin
Result := InsPath;
end;
end;

procedure LogoOnClick(Sender: TObject);
var ResCode: Integer;
begin
ShellExec('', '{#MyAppURL}', '' , '', SW_SHOW, ewNoWait, ResCode)
end;

procedure RedesignWizardForm;
var
i: integer;
BtnPanel: TPanel;
BtnImage: TBitmapImage;

begin
ExtractTemporaryFile('logo.bmp')
BtnPanel:=TPanel.Create(WizardForm)
with BtnPanel do begin
Left:=0
Top:=315
Width:=179
Height:=46
Cursor:=crHand
OnClick:=@logoOnClick
Parent:=WizardForm
end;
BtnImage:=TBitmapImage.Create(WizardForm)
with BtnImage do begin
AutoSize:=True;
Enabled:=False;
Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\logo.bmp')
Parent:=BtnPanel
end;

with WizardForm do
begin
Caption := ExpandConstant('{cm:Main}');
end;

with WizardForm.WizardBitmapImage do
begin
Width := ScaleX(502);
end;

with WizardForm.WelcomeLabel2 do
begin
Visible := False;
end;

with WizardForm.WelcomeLabel1 do
begin
Visible := False;
end;

with WizardForm.WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Width := ScaleX(502);
Height := ScaleY(70);
end;

with WizardForm.PageDescriptionLabel do
begin
Visible := False;
end;

with WizardForm.PageNameLabel do
begin
Visible := False;
end;

with WizardForm.WizardBitmapImage2 do
begin
Width := ScaleX(502);
end;

with WizardForm.FinishedLabel do
begin
Visible := False;
end;

with WizardForm.FinishedHeadingLabel do
begin
Visible := False;
end;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
end;





Название шрифтов: ANDLSO.TTF, ASROCK7SEGMENT.TTF, CONSTAN.TTF, CONSTANB.TTF, CONSTANI.TTF, CONSTANZ.TTF, CUPRUM.TTF, NeogreyMedium.otf ,NeogreyRegular.otf, XVMSymbol_4.0.ttf
Путь к шрифтам: MODS\FONTS\

NAMAT 13-01-2014 09:12 2288080

У меня такой вопрос как сделать при установке поле в которое вписываеш слово и оно в последующем заноситься в ini файл в определенное место и сохраняеться в карневой папке установленого проекта

saurn 13-01-2014 21:36 2288547

Цитата:

Цитата NAMAT
У меня такой вопрос как сделать при установке поле в которое вписываеш слово и оно в последующем заноситься в ini файл в определенное место и сохраняеться в карневой папке установленого проекта »

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

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[INI]
Filename: {app}\Test.ini; Section: TestSection; Key: TestKey; String: {code:IniStr};


[Code]
var
   
InputPage: TInputQueryWizardPage;


function IniStr(const Input: String): String;
begin
   
Result := InputPage.Values[0];
end;


procedure InitializeWizard;
begin
   
InputPage := CreateInputQueryPage(wpSelectDir, 'Caption', 'Description', 'SubCaption');

    InputPage.Add('Input Value:', False);
    InputPage.Values[0] := 'Test_Value';
end;


habib2302 14-01-2014 13:46 2288878

доброе время суток. как сделать так, чтобы при выборе компонента portable в SelectDirPage стояла кнопка установить вместо кнопки далее?
вот пример
читать дальше »
Код:

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  wpSelectTasks:
    if IsComponentSelected('VKMusic\instal') then
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;

  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]
      if IsComponentSelected('VKMusic\Portable') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Portable'
  end;
  end;
 end;
end;


Shkutu 14-01-2014 16:37 2288995

habib2302, может просто добавить аналогично твоему же примеру
читать дальше »
Код:

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  wpSelectTasks:
    if IsComponentSelected('VKMusic\instal') then
  begin
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
  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]
      if IsComponentSelected('VKMusic\Portable') then
  begin
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Portable';
    WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
  end;
  end;
 end;
end;


saurn 14-01-2014 20:13 2289194

habib2302,
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
    case CurPageID of
        wpSelectDir: if IsComponentSelected('VKMusic\instal') then WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
    end;
end;


novahudonoser 15-01-2014 23:23 2289935

КОМРАДЫ! Подскажите пожалуйста реализацию скрипта: "с возможностью обновления программы"
пример:
установщик перед началом распаковки новых файлов - проверяет не только их наличие в системе но и их состояние
в часности, та программа которую пользователь пытается обновить - уже запущена, следовательно скрипт должен отправить приложению мессагу что бы та благополучно закрылась
и только потом уже копировал файлы с заменой.

собственно интересует реализация:
1. проверяем, запущена программа или нет
2. если запущена то закрываем её

полагаю что где то рядом с [Setup]: CloseApplications
но как юзать не догнал (

nik1967 16-01-2014 00:22 2289961

novahudonoser, шапка - Ссылки на примеры скриптов: - Запущен ли процесс (WMI)/Запущен ли процесс - Закрытие процесса - изучай, применяй.

novahudonoser 16-01-2014 00:56 2289980

пример закрытия приложения не компилится (
http://joxi.ru/y_XWUhjKTJBsG5SWhto

novahudonoser 16-01-2014 01:20 2289987

кстати Сборник скриптов в формате chm не пашет http://joxi.ru/fvvWUhjKTJBtGxme7BI

saurn 16-01-2014 01:28 2289990

Цитата:

Цитата novahudonoser
пример закрытия приложения не компилится ( »

У вас не установлен препроцессор

PerfectLove 16-01-2014 01:39 2289997

Помогите сделать второй чекбокс для бекапа.
Код:

[_Code]
var
MyTask: TCheckBox;
 
function MoveFile(const srcFile, destFile: PAnsiChar): 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:=['*']; // указать файлы или маски нужные для бакупа через запятую. при указании маски '*' бакупятся все файлы с вложенными папками
      MyDir:=ExpandConstant('{app}'+'\'); //папка откуда бакупить
      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:='Create Backup';
    Left:=ScaleX(0);
    Top:=ScaleY(100);
    Width:=ScaleX(400);
    Height:=ScaleY(15);
    TabOrder:=0;
    Checked:=True;
  end;
end;


saurn 16-01-2014 03:03 2290015

Цитата:

Цитата PerfectLove
Помогите сделать второй чекбокс для бекапа. »

Не уловил суть. Просто второй чекбокс? Пожалуйста, здесь массив чекбоксов с двумя элементами. Действие назначено только для чекбокса с индексом 0(arrayChkBox[0]):
Пример
Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
   
arrayChkBox: array of TCheckBox;


procedure CreateChkBox();
var
   
i, Len: Integer;
begin
   
SetArrayLength(arrayChkBox, 2);
    Len := GetArrayLength(arrayChkBox) - 1;
   
    for i := 0 to Len do
        begin
           
arrayChkBox[i] := TCheckBox.Create(nil);
            with arrayChkBox[i] do
            begin
               
Parent := WizardForm.SelectDirPage;
                SetBounds(ScaleX(0), ScaleY(115 + i*20), ScaleX(400), ScaleY(15));
                Checked := True;

                case i of
                   
0: Caption := 'Create Backup';
                    Len: Caption := 'Create Backup 2';
                end;
            end;
        end;
end;


procedure InitializeWizard();
begin
   
CreateChkBox();
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
   
FindFiles: TFindRec;
    i: Integer;
    MyFiles: array of string;
    MyDir, BackDir: string;
begin
    case
CurStep of
       
ssInstall:
        begin
            if
arrayChkBox[0].Checked then
            begin
               
MyFiles := ['*'];
                MyDir := ExpandConstant('{app}' + '\');
                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;
end;




И пример попроще, без массива. Действие назначено только для чекбокса MyTask:
Пример
Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
   
MyTask, MyTask2: TCheckBox;


procedure CreateChkBox();
begin
   
MyTask := TCheckBox.Create(nil);
    with MyTask do
    begin
       
Parent := WizardForm.SelectDirPage;
        SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
        Caption := 'Create Backup';
        Checked := True;
    end;
   
    MyTask2 := TCheckBox.Create(nil);
    with MyTask2 do
    begin
       
Parent := WizardForm.SelectDirPage;
        SetBounds(ScaleX(0), ScaleY(MyTask.Top + 20), ScaleX(400), ScaleY(15));
        Caption := 'Create Backup2';
        Checked := True;
    end;
end;


procedure InitializeWizard();
begin
   
CreateChkBox();
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
   
FindFiles: TFindRec;
    i: Integer;
    MyFiles: array of string;
    MyDir, BackDir: string;
begin
    case
CurStep of
       
ssInstall:
        begin
            if
MyTask.Checked then
            begin
               
MyFiles := ['*'];
                MyDir := ExpandConstant('{app}' + '\');
                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;
end;



P. S.
На форуме полно примеров, как создать кастомный чекбокс.

PerfectLove 16-01-2014 04:59 2290028

Цитата:

Цитата saurn
Не уловил суть. »

Виноват, мой косяк что не уточнил. На данный момент первый чекбокс делает бекап всей папки. Хочу добавить второй чекбокс чтобы делать бекап только нескольких файлов а не всей папки.

saurn 16-01-2014 06:09 2290032

Цитата:

Цитата PerfectLove
На данный момент первый чекбокс делает бекап всей папки. Хочу добавить второй чекбокс чтобы делать бекап только нескольких файлов а не всей папки. »

Пример
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program\Fonts
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}; Flags: external overwritereadonly ignoreversion;


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
   
arrayChk: array of TCheckBox;


function ChkChecked(const Index: Integer): Boolean;
var
   
Len: Integer;
begin
   
Len := GetArrayLength(arrayChk) - 1;

    if Index > Len then Exit;
    Result := arrayChk[Index].Checked;
end;


procedure CreateBackup();
var
   
FindFiles: TFindRec;
    i, Len: Integer;
    MyFiles: array of string;
    MyDir, BackDir: string;
begin
   
Len := GetArrayLength(arrayChk) - 1;
    if (ChkChecked(0) and ChkChecked(Len)) then Exit; //Если выбраны оба чекбокса резервная копия создана не будет
   
if ChkChecked(0) then MyFiles := ['*']; //Резервное копирование папки
   
if ChkChecked(Len) then MyFiles := ['ariali.ttf', 'tahoma.ttf', 'verdana.ttf']; //Резервное копирование определенных файлов
   
MyDir := ExpandConstant('{app}' + '\');
    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;


procedure CreateChk();
var
   
i, Len: Integer;
begin
   
SetArrayLength(arrayChk, 2);
    Len := GetArrayLength(arrayChk) - 1;

    for i := 0 to Len do
    begin
       
arrayChk[i] := TCheckBox.Create(nil);
        with arrayChk[i] do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(115 + i*20), ScaleX(400), ScaleY(15));

            case i of
               
0: Caption := 'Создать резервную копию папки';
                Len: Caption := 'Создать резервную копию основных файлов';
            end;
        end;
    end;
end;


procedure InitializeWizard();
begin
   
CreateChk();
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
   
Len: Integer;
begin
   
Len := GetArrayLength(arrayChk) - 1;

    case CurStep of
       
ssInstall: if (ChkChecked(0) or ChkChecked(Len)) then CreateBackup();
    end;
end;


nik1967 16-01-2014 07:09 2290036

Цитата:

Цитата novahudonoser
кстати Сборник скриптов в формате chm не пашет »

писали уже наверно 100500 раз - правой кнопкой по файлу - свойства - разблокировать.

PerfectLove 16-01-2014 08:27 2290051

Цитата:

Цитата saurn
Тогда, наверное, будет правильней создать две радио-кнопки, »

Не совсем. Радио-кнопки будут заставлять пользователя делать бекап первого или другого варианта. Я не хочу "заставлять" делать бекап. Чекбоксы подойдут лучше а возможность вибирать два варианта одновременно будет уже на совести пользавтела так как изначально чекбоксы не будут выбраны

saurn 16-01-2014 09:01 2290063

Цитата:

Цитата PerfectLove
Чекбоксы подойдут лучше »

Исправленный пример в моем предыдущем посте http://forum.oszone.net/post-2290032-1849.html

novahudonoser 16-01-2014 14:44 2290233

Цитата:

Цитата saurn
У вас не установлен препроцессор »

Вы извините, я со скриптами дела не имел, поставил сейчас ispack-5.5.4.exe в составе которого идёт этот препроцессор и Inno Script Studio
однако код не компилится http://joxi.ru/RsHXUv3JTJAILoANWhM
Код:

[Setup]
AppName=My_programm 1.7
AppVerName=My_programm
AppVersion=1.7
OutputDir=output\
OutputBaseFilename=My_programm_1.7
DefaultDirName={pf}\My_programm
AllowNoIcons=yes
DefaultGroupName=My_programm
DisableStartupPrompt=yes
DisableReadyPage=yes
Compression=lzma
SolidCompression=yes

#define A = (Defined UNICODE) ? "W" : "A"
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_VM_OPERATION = $8;
    PROCESS_VM_READ = $10;
    PROCESS_VM_WRITE = $20;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    MEM_COMMIT = $1000;
    MEM_RESERVE = $2000;
    PAGE_EXECUTE_READWRITE = $40;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    MAX_PATH = 260;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;

   
type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of Char;
    end;
   
    LUID = record
        LowPart: DWORD;
        HighPart: Longint;
    end;
   
    LUID_AND_ATTRIBUTES = record
        Luid: LUID;
        Attributes: DWORD;
    end;
   
    TOKEN_PRIVILEGES = record
        PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
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';
#endif
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';


/////////////////////////////////////////////////////////
function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;

////////////////////////////////////////////////////////////
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
    dwID: DWORD;
begin
    GetWindowThreadProcessId(hwnd, dwID);
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;

////////////////////////////////////////////////////////////////////////
function TerminateApp(const szProcess: String; dwTimeout: DWORD): DWORD;
var
    hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    aBuf: array [0..259] of Char;
    szFileName, szDeviceName: String;
    tkp: TOKEN_PRIVILEGES;
    SeDebugNameValue: LUID;
    i, lpMemory, ret: Longint;
    lpThreadId, dwDrives: DWORD;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
        pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
            if CompareText(CharArrayToString(pe32.szExeFile), ExtractFileName(szProcess)) <> 0 then Continue;
            // try open process
            hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
            if hProc = TA_FAILED then
            begin
                // open process token adjust privileges
                if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                try
                    // fill token privileges struct
                    tkp.PrivilegeCount := 1;
                    tkp.Privileges[0].Luid := SeDebugNameValue;
                    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    // set debug privileges
                    if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
                    // try open process with debug privileges
                    hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                    if hProc = TA_FAILED then Exit;
                finally
                    tkp.Privileges[0].Attributes := 0;
                    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
                    CloseHandle(hToken);
                end;
            end;
            // if szProcess is full path
            if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then
            begin
                GetProcessImageFileName(hProc, aBuf[0], SizeOf(aBuf));
                szFileName := CharArrayToString(aBuf);
                dwDrives := GetLogicalDrives();
                for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
                begin
                    QueryDosDevice(Format('%s:', [Chr(Ord('A') + i)]), aBuf[0], SizeOf(aBuf));
                    szDeviceName := CharArrayToString(aBuf);
                    if Pos(szDeviceName, szFileName) = 0 then Continue;
                    StringChangeEx(szFileName, szDeviceName, Format('%s:', [Chr(Ord('A') + i)]), True);
                    if CompareText(szProcess, szFileName) = 0 then Break;
                end;
                if CompareText(szProcess, szFileName) <> 0 then
                begin
                    CloseHandle(hProc);
                    Continue;
                end;
            end;
            // try stop process
            try
                EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
                case WaitForSingleObject(hProc, dwTimeout) of
                    WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                    WAIT_TIMEOUT: try
                        lpProcName := GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitProcess');
                        if lpProcName = 0 then Exit;
                        //
                        lpMemory := VirtualAllocEx(hProc, 0, SizeOf(lpProcName), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                        if not WriteProcessMemory(hProc, lpMemory, lpProcName, SizeOf(lpProcName), ret) then Exit;
                        //
                        hThread := CreateRemoteThread(hProc, 0, 0, lpMemory, 0, 0, lpThreadId);
                        if hThread > 0 then
                        case WaitForSingleObject(hThread, dwTimeout) of
                            WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                            WAIT_TIMEOUT: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                        end;
                    finally
                        CloseHandle(hThread);
                    end;
                end;
            finally
                CloseHandle(hProc);
                if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then Exit;
            end;
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
    TerminateApp('calc.exe', 5000);
end;


vint56 16-01-2014 16:32 2290303

novahudonoser

[code] должно стоять
#define A = (Defined UNICODE) ? "W" : "A"

novahudonoser 16-01-2014 16:51 2290313

ой, [code] я забыл поставить да
только ошибки не кончаются (
http://joxi.ru/stXXUv3JTJAALiyxiR0

походу это стандартная win32 функция
не знаю как inno подключает win32 api
возможно, необходим некий "include", "import", "using" или что-то подобное

подскажите братцы

vint56 16-01-2014 18:06 2290372

novahudonoser

[code]
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';

novahudonoser 16-01-2014 18:14 2290383

http://joxi.ru/EenXUv3JTJDlct1uZX4
я уже не уверен что это вообще заработает
может ктонить запустить у себя проверить что не так с этим кодом?

NAMAT 16-01-2014 18:57 2290409

Не срабатывает кнопка отмены во время распаковки файлов помогите весь код просмотрел так и не нашол причину


Код:

const
  PCFonFLY=true;
  notPCFonFLY=false;

var
  Enabled: Boolean;
  hCancelBtn, hNextBtn, hBackBtn, hDirBrowseBtn, hGroupBrowseBtn: HWND;
  Welcomelbl1, Selectlbl1, Selectlbl2, MainLabel, Mb1, Mb2, NoIconsLabel, islbl1, islbl2, islbl3: TLabel;
  WFButtonFont: TFont;
  form, form1: Longint;
  NoIconsCheck: TNewCheckBox;
  IntList, VoiceList: TNewCheckListBox;
  ISDoneCancel: Integer;
  ISDoneError: Boolean;
  PCFVer: Double;
  s: AnsiString;
  InputPage: TInputQueryWizardPage;
  CaptionLabel: TLabel;

function ReleaseCapture: Longint; external 'ReleaseCapture@user32.dll stdcall';

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

#include "AddIss\botva2.iss"
#include "AddIss\progressbar.iss"

var
  ISDonePB: TImgPB;

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
  if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
  Result:=True;
end;

function cm(s: PAnsiChar): String;
begin
  Result:= ExpandConstant('{cm:'+s+'}');
end;

///////////////////////////////////////////////////////////////////////////////////////////////////
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 ImgPBSetPosition(ISDonePB, OveralPct);
  WizardForm.Caption:= s + ' - ' + IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
  islbl1.Caption:= cm('Extracted') + ' ' + IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
  islbl2.Caption:= MinimizePathName(ExpandConstant('{app}\')+CurrentFile, islbl2.Font, ScaleX(400));
  Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(hBtn: HWND);
begin
  SuspendProc;
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then begin
  ISDoneCancel:=1;
  islbl1.Caption:= cm('rbc');
  end;
  ResumeProc;
end;


function CheckError:boolean;
begin
  Result:= not ISDoneError;
end;

//************************************************ [Начало - Загрузка изображений и подготовка визарда] ***************************************************//
procedure CreateWizardImg;
begin
with WizardForm do begin
 ClientWidth:=ScaleX(623);
 ClientHeight:=ScaleY(382);
 InnerNotebook.Hide;
 OuterNotebook.Hide;
 Bevel.Hide;
 Center;
 Color:= $191919;
end;

  ImgLoad(WizardForm.Handle, 'fon.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
  form:= ImgLoad(WizardForm.Handle, 'form.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
  form1:= ImgLoad(WizardForm.Handle, 'form1.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
  ImgLoad(WizardForm.Handle, 'logo.png', ScaleX(20), ScaleY(326), ScaleX(190), ScaleY(39), True, True);

  ImgSetVisibility(form1, false);

  ImgApplyChanges(WizardForm.Handle);
end;
//************************************************ [Конец - Загрузка изображений и подготовка визарда] ***************************************************//

//************************************************ [Начало - Текстуры кнопок] ***************************************************//

procedure SetStateNewButtons;
begin
  with WizardForm.BackButton do begin
    BtnSetText(hBackBtn,PAnsiChar(Caption));
    BtnSetVisibility(hBackBtn,Visible);
    BtnSetEnabled(hBackBtn,Enabled);
  end;
  with WizardForm.NextButton do begin
    BtnSetText(hNextBtn,PAnsiChar(Caption));
    BtnSetVisibility(hNextBtn,Visible);
    BtnSetEnabled(hNextBtn,Enabled);
  end;
  with WizardForm.CancelButton do begin
    BtnSetText(hCancelBtn,PAnsiChar(Caption));
    BtnSetVisibility(hCancelBtn,Visible);
    BtnSetEnabled(hCancelBtn,Enabled);
  end;
  BtnSetText(hDirBrowseBtn,PAnsiChar(WizardForm.DirBrowseButton.Caption));
  BtnSetText(hGroupBrowseBtn,PAnsiChar(WizardForm.GroupBrowseButton.Caption));
end;

procedure WizardFormBtnClick(hBtn:HWND);
var
  Btn: TButton;
begin
  case hBtn of
    hCancelBtn: Btn:=WizardForm.CancelButton;
    hNextBtn: Btn:=WizardForm.NextButton;
    hBackBtn: Btn:=WizardForm.BackButton;
    hDirBrowseBtn: Btn:=WizardForm.DirBrowseButton;
    hGroupBrowseBtn: Btn:=WizardForm.GroupBrowseButton;
  end;
  Btn.OnClick(Btn);
  SetStateNewButtons;
  BtnRefresh(hBtn);
end;

procedure NoIconsCheckClick(Sender: TObject);
begin
  if NoIconsCheck.Checked then begin
    WizardForm.GroupEdit.Enabled:= false;
    WizardForm.GroupBrowseButton.Enabled:= false;
    BtnSetEnabled(hGroupBrowseBtn, false);
  end else begin
    WizardForm.GroupEdit.Enabled:= true;
    WizardForm.GroupBrowseButton.Enabled:= true;
    BtnSetEnabled(hGroupBrowseBtn, true);
  end;
  WizardForm.NoIconsCheck.Checked:= NoIconsCheck.Checked;
  WizardForm.GroupEdit.Color:= clblack;
end;

procedure NoIconsLabelClick(Sender: TObject);
begin
  NoIconsCheck.Checked:= not NoIconsCheck.Checked;
  NoIconsCheckClick(nil);

end;

procedure ButtonsTextures;
begin
  WFButtonFont:=TFont.Create;
  WFButtonFont.Style:=[fsBold];
  WFButtonFont.Name:= 'Arial';
  WFButtonFont.Size:= 8;

  with WizardForm.BackButton do begin
    hBackBtn:= BtnCreate(WizardForm.Handle, ScaleX(Left+28), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
    BtnSetEvent(hBackBtn, BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
    BtnSetFont(hBackBtn, WFButtonFont.Handle);
    BtnSetFontColor(hBackBtn, clblack, clblack, clblack, clblack);
    Width:=0;
    Height:=0;
  end;

  with WizardForm.NextButton do begin
    hNextBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+55), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
    BtnSetEvent(hNextBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
    BtnSetFont(hNextBtn,WFButtonFont.Handle);
    BtnSetFontColor(hNextBtn, clblack, clblack, clblack, clblack);
    Width:=0;
    Height:=0;
  end;

  with WizardForm.CancelButton do begin
    hCancelBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+85), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
    BtnSetEvent(hCancelBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
    BtnSetFont(hCancelBtn,WFButtonFont.Handle);
    BtnSetFontColor(hCancelBtn, clblack, clblack, clblack, clblack);
    Width:=0;
    Height:=0;
  end;

  with WizardForm.DirBrowseButton do begin
    hDirBrowseBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+90), ScaleY(Top+164), ScaleX(100), ScaleY(35), 'button.png', 1, False);
    BtnSetEvent(hDirBrowseBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
    BtnSetFont(hDirBrowseBtn,WFButtonFont.Handle);
    BtnSetFontColor(hDirBrowseBtn, clblack, clblack, clblack, clblack);
    Width:=0;
    Height:=0;
  end;

  with WizardForm.GroupBrowseButton do begin
    hGroupBrowseBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+90), ScaleY(Top+164), ScaleX(100), ScaleY(35), 'button.png', 1, False);
    BtnSetEvent(hGroupBrowseBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
    BtnSetFont(hGroupBrowseBtn,WFButtonFont.Handle);
    BtnSetFontColor(hGroupBrowseBtn, clblack, clblack, clblack, clblack);
    Width:=0;
    Height:=0;
  end;
end;

//************************************************ [Конец - Текстуры кнопок] ***************************************************//

//************************************************ [Начало - Место на жестком диске] ***************************************************//

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 MbOrTB(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 GetFreeSpaceCaption(Sender: TObject);
var
  Enable: Boolean;
  Path: AnsiString;
  FreeMB, TotalMB: Cardinal;
begin
  Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
  Enable:= GetSpaceOnDisk(Path, True, FreeMB, TotalMB);

  if not Enable then begin
    mb1.Caption:= cm('FreeSpace') + ' ' + '0 Мб';
    mb2.Caption:= cm('NeedSpace') + ' ' + MborTb({#NeedSize});
    WizardForm.NextButton.Enabled:= false;
    BtnSetEnabled(hNextBtn, false);
    Exit;
  end;
 
  if Enable then begin
    mb1.Caption:= cm('FreeSpace') + ' ' + MbOrTb(FreeMB);
    mb2.Caption:= cm('NeedSpace') + ' ' + MborTb({#NeedSize});
    WizardForm.NextButton.Enabled:= true;
    BtnSetEnabled(hNextBtn, true);
  end;
 
  if FreeMB < {#NeedSize} then begin WizardForm.NextButton.Enabled:= false; BtnSetEnabled(hNextBtn, false); end else begin WizardForm.NextButton.Enabled:= true; BtnSetEnabled(hNextBtn, true); end;
end;

//************************************************ [Конец - Место на жестком диске] ***************************************************//

//************************************************ [Начало - Создание лебелов] ***************************************************//
procedure CreateLabel;
begin
Welcomelbl1:= TLabel.Create(WizardForm);
with Welcomelbl1 do
begin
  Left:= ScaleX(80);
  Top:= ScaleY(244);
  Width:= ScaleX(450);
  Height:= ScaleY(450);
  AutoSize:= false;
  Transparent:= true;
  WordWrap:= true;
  Font.Name:= 'Arial';
  Font.Size:= 8;
  Font.Color:= clwhite;
  Font.Style := [fsBold];
  Alignment := taCenter;
  Parent:= WizardForm;
  Caption:= cm('Welcome');
end;

with WizardForm.DirEdit do begin
  Parent:= WizardForm;
  Left:= ScaleX(100);
  Top:= ScaleY(250);
  Color:= clblack;
  Font.Name:= 'Arial';
  Font.Size:= 9;
  Font.Color:= clwhite;
  Width:= ScaleX(324);
  Height:= ScaleY(18);
end;

with WizardForm.GroupEdit do begin
  Parent:= WizardForm;
  Left:= ScaleX(100);
  Top:= ScaleY(250);
  Color:= clblack;
  Font.Name:= 'Arial';
  Font.Size:= 9;
  Font.Color:= clwhite;
  Width:= ScaleX(324);
  Height:= ScaleY(18);
end;

Selectlbl1:=TLabel.Create(WizardForm);
with Selectlbl1 do
begin
  Left:= ScaleX(100);
  Top:= ScaleY(200);
  Width:= ScaleX(450);
  Height:= ScaleY(200);
  AutoSize:= false;
  WordWrap:= true;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Transparent:= true;
  Font.Color:= clwhite;
  Parent:= WizardForm;
  Caption:= cm('dir1');
end;

Selectlbl2:=TLabel.Create(WizardForm);
with Selectlbl2 do
begin
  Left:= ScaleX(100);
  Top:= ScaleY(216);
  Width:= ScaleX(450);
  Height:= ScaleY(200);
  AutoSize:= false;
  WordWrap:= true;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Transparent:= true;
  Font.Color:= clwhite;
  Parent:= WizardForm;
  Caption:= cm('dir2');
end;

//with WizardForm.DirBrowseButton do begin
//  Parent:= WizardForm;
//  Left:= ScaleX(720);
//  Top:= ScaleY(200);
//  Font.Name:= 'Arial';
//  Font.Size:= 9;
//  Font.Color:= $aeacac;
//end;

//with WizardForm.GroupBrowseButton do begin
//  Parent:= WizardForm;
//  Left:= ScaleX(720);
//  Top:= ScaleY(200);
//  Font.Name:= 'Arial';
//  Font.Size:= 9;
//  Font.Color:= $aeacac;
//end;

mb1:=TLabel.Create(WizardForm);
with mb1 do
begin
  Left:= ScaleX(100);
  Top:= ScaleY(278);
  Width:= ScaleX(450);
  Height:= ScaleY(200);
  AutoSize:= false;
  WordWrap:= true;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Transparent:= true;
  Font.Color:= clwhite;
  Parent:= WizardForm;
end;

mb2:=TLabel.Create(WizardForm);
with mb2 do
begin
  Left:= ScaleX(100);
  Top:= ScaleY(295);
  Width:= ScaleX(450);
  Height:= ScaleY(200);
  AutoSize:= false;
  WordWrap:= true;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Transparent:= true;
  Font.Color:= clwhite;
  Parent:= WizardForm;
end;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;

NoIconsCheck:= TNewCheckbox.Create(WizardForm);
  with NoIconsCheck do
  begin
    Left:= ScaleX(100);
    Top:= ScaleY(280);
    Width:= ScaleX(13);
    Height:= ScaleY(13);
    Parent:= WizardForm;
    OnClick:= @NoIconsCheckClick;
  end;

  ExtractTemporaryFile('1.bmp');
 
with WizardForm.ComponentsList do begin
  LoadBGBmpFromFile(ExpandConstant('{tmp}\1.bmp'), Left+100, Top+150);
  Parent:= WizardForm;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Font.Color:= clwhite;
  left:= ScaleX(100);
  BorderStyle:= bsNone;
  Top:= ScaleY(200);
  Height:= Height - 50;
end;
  DeleteFile(ExpandConstant('{tmp}\1.bmp'));
 
islbl1:=TLabel.Create(WizardForm);
with islbl1 do
begin
  Left:= ScaleX(100);
  Top:= ScaleY(255);
  Width:= ScaleX(450);
  Height:= ScaleY(200);
  AutoSize:= false;
  WordWrap:= true;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Transparent:= true;
  Font.Color:= clwhite;
  Parent:= WizardForm;
  Caption:= cm('Extracted');
end;

islbl2:=TLabel.Create(WizardForm);
with islbl2 do
begin
  Left:= ScaleX(100);
  Top:= ScaleY(270);
  Width:= ScaleX(450);
  Height:= ScaleY(200);
  AutoSize:= false;
  WordWrap:= true;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Transparent:= true;
  Font.Color:= clwhite;
  Parent:= WizardForm;
end;

NoIconsLabel:=TLabel.Create(WizardForm);
with NoIconsLabel do
 begin
  Left:= ScaleX(120);
  Top:= ScaleY(280);
  Width:= ScaleX(450);
  Height:= ScaleY(200);
  AutoSize:= false;
  Font.Name:= 'Arial';
  Font.Size:= 8
  Font.Style := [fsBold];
  Transparent:= true;
  Font.Color:= clwhite;
  Parent:= WizardForm;
  Caption:= cm('nic');
  OnClick:= @NoIconsLabelClick;
 end;
end;
//************************************************ [Конец - Создание лебелов] ***************************************************//

function IniStr(Input: String): String;
begin
    Result := InputPage.Values[0];
end;

procedure createInPage();
begin
  InputPage := CreateInputQueryPage(wpSelectDir, #0, #0, #0);

  InputPage.Add(#0, False);
  with InputPage do
  begin
    Edits[0].Parent:= WizardForm;
    Edits[0].SetBounds(ScaleX(100), ScaleX(250), ScaleX(324), ScaleY(18));
    Edits[0].Color:= clblack;
    Edits[0].Font.Name:= 'Arial';
    Edits[0].Font.Size:= 9;
    Edits[0].Font.Color:= clwhite;

    CaptionLabel:=TLabel.Create(WizardForm);
    with CaptionLabel do
    begin
      Parent:= WizardForm;
      SetBounds(ScaleX(100), ScaleX(200), ScaleX(324), ScaleY(26));
      AutoSize:= false;
      WordWrap := True;
      Font.Name:= 'Arial';
      Font.Size:= 8
      Font.Style := [fsBold];
      Transparent:= true;
      Font.Color:= clwhite;
      Caption:= 'Введите желаемый ник в игре.'
    end;
  end;
end;

procedure InitializeWizard;
begin
  s:= WizardForm.Caption;
  Enabled:= true;
  CreateLabel;
  CreateWizardImg;
  ButtonsTextures;
  createInPage();
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  SetStateNewButtons;
 
  Welcomelbl1.Hide;
  WizardForm.DirEdit.Hide;
  WizardForm.GroupEdit.Hide;
  Selectlbl1.Hide;
  Selectlbl2.Hide;
  BtnSetVisibility(hDirBrowseBtn, false);
  BtnSetVisibility(hGroupBrowseBtn, false);
  mb1.Hide;
  mb2.Hide;
  NoIconsCheck.Hide;
  NoIconsLabel.Hide;
  WizardForm.ComponentsList.Hide;
  islbl1.Hide;
  InputPage.Edits[0].Hide;
  CaptionLabel.Hide;

  if CurPageID = wpWelcome then
  begin
    Welcomelbl1.Show;
    ImgSetVisibility(form, true);
    ImgSetVisibility(form1, false);
  end;

  if CurPageID = wpSelectDir then
  begin
    GetFreeSpaceCaption(nil);
    Selectlbl2.Caption:= cm('Dir2');
    WizardForm.DirEdit.Show;
    Selectlbl1.Show;
    Selectlbl1.Caption:= cm('Dir1');
    Selectlbl2.Show;
    BtnSetVisibility(hDirBrowseBtn, true);
    ImgSetVisibility(form1, true);
    ImgSetVisibility(form, false);
    mb1.Show;
    mb2.Show;
  end;
 
  if CurPageID = InputPage.ID then
  begin
    InputPage.Edits[0].Show;
    CaptionLabel.Show;
  end;

  if CurPageID = wpSelectComponents then WizardForm.ComponentsList.Show;

  if CurPageID = wpSelectProgramGroup then
  begin
    Selectlbl1.Caption:= cm('Group1');
    Selectlbl1.Show;
    Selectlbl2.Show;
    Selectlbl2.Caption:= cm('Dir2');
    WizardForm.GroupEdit.Show;
    BtnSetVisibility(hGroupBrowseBtn, true);
    NoIconsCheck.Show;
    NoIconsLabel.Show;
    WizardForm.NextButton.Caption:= 'Установить';
  end;

  if CurPageID = wpSelectTasks then
  begin

  end;

  if CurPageID = wpReady then
  begin                                                                                               
    ImgSetVisibility(form1, true);
  end;

  if CurPageID = wpInstalling then
  begin
    ImgSetVisibility(form, true);
    ImgSetVisibility(form1, false);
    islbl1.Show;
  end;

  if CurPageID = wpFinished then
  begin
    ImgSetVisibility(form, true);
    islbl2.Hide;
    Welcomelbl1.Show;
    Welcomelbl1.Caption:= cm('Fin');
    Welcomelbl1.Top:= Welcomelbl1.Top+ScaleY(5);
  end;

  if (CurPageID = wpFinished) and ISDoneError then
  begin
    Welcomelbl1.Show;
    Welcomelbl1.Font.Color:= clred;
    Welcomelbl1.Caption:= cm('FinError');
  end;
  ImgApplyChanges(WizardForm.Handle);
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;
    ISDonePB:= ImgPBCreate(WizardForm.Handle, ExpandConstant('pb2.png'),ExpandConstant('pb1.png'), ScaleX(100), ScaleY(290), ScaleX(420), ScaleY(19));

    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

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для 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, 0, @ProgressCallback) then begin
      repeat
        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;
      ImgPBDelete(ISDonePB);
      islbl2.Hide;
      islbl1.Caption:= SetupMessage(msgStatusRunProgram);
      ISDoneStop;
    end;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;

procedure DeinitializeSetup;
begin
  if Enabled then gdipShutdown;
  WizardForm.Free;
end;


novahudonoser 16-01-2014 23:05 2290563

Ладно
покуда нет решения как корректно завершить процесс на этапе установки спрошу ещё вот что:
есть небольшой код который находит запущенный процесс
интересует следующее, как его допилить чтобы установщик отключал кнопку [Далее] дабы пользователь выполнил требование (закрыл требуемый процесс)
Код:

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;

procedure InitializeWizard();
begin
  if IsProcessRunning('calc.exe') then 
  // Программа запущена, какие варианты у установщика
  // прервать установку и закрыться либо
  // ожидать когда пользователь самостоятельно завешит работу программы и продолжит установку
  else
    // Программа не запущено можно продолжить установку
end;


saurn 17-01-2014 02:55 2290655

Цитата:

Цитата novahudonoser
я уже не уверен что это вообще заработает
может ктонить запустить у себя проверить что не так с этим кодом? »

С этим кодом все в порядке. Просто вы компилируете на стандартной версии Inno. Установите расширенную версию от китайских собратьев, она есть в шапке соседней темы http://forum.oszone.net/showthread.php?p=1201499# , и проблема исчерпает себя.

Цитата:

Цитата novahudonoser
чтобы установщик отключал кнопку [Далее] дабы пользователь выполнил требование (закрыл требуемый процесс) »

Можно так
Код:

#ifndef IS_ENHANCED
    #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif


[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Code]
const
   
TIMER_ID = 01;


type
   
TFNTimerProc = Longint;


function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; lpTimerFunc: TFNTimerProc): UINT; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; external 'KillTimer@user32.dll stdcall';


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;


procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
   
WizardForm.NextButton.Enabled := not IsProcessRunning('calc.exe');
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
CurPageID of
       
wpWelcome: SetTimer(WizardForm.Handle, TIMER_ID, 30, CallbackAddr('TimerProc'));
        wpInstalling: KillTimer(WizardForm.Handle, TIMER_ID);
    end;
end;


procedure DeinitializeSetup();
begin
   
KillTimer(WizardForm.Handle, TIMER_ID);
end;



----------------------------------------------------------------------------------------
Только правильней будет проверять все это дело на этапе инициализации, с выводом MsgBox с соответствующим сообщением, если будет обнаружен запущенный процесс приложения, дабы не ввергнуть пользователя в недоумение, при виде неактивной кнопки "Далее".
Пример
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Code]
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
   
Result := not IsProcessRunning('calc.exe');
    if not Result then MsgBox('Обновляемое приложение запущено. Завершите процесс приложения и повторите попытку.', mbError, MB_OK);
end;



----------------------------------------------------------------------------------------
И пример от El Sanchez, адаптированный под ваши нужды(обнаружение запущенного процесса и его закрытие по запросу).
Пример
Код:

#ifndef IS_ENHANCED
    #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif


[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


const
   
TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_VM_OPERATION = $8;
    PROCESS_VM_READ = $10;
    PROCESS_VM_WRITE = $20;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    MEM_COMMIT = $1000;
    MEM_RESERVE = $2000;
    PAGE_EXECUTE_READWRITE = $40;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    MAX_PATH = 260;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;
   
   
type
   
TPROCESSENTRY32 = record
       
dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of Char;
    end;

    LUID = record
       
LowPart: DWORD;
        HighPart: Longint;
    end;

    LUID_AND_ATTRIBUTES = record
       
Luid: LUID;
        Attributes: DWORD;
    end;

    TOKEN_PRIVILEGES = record
       
PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;
   

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
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';
#endif
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';


function CharArrayToString(aChar: array of Char): String;
begin
   
Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;


function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
   
dwID: DWORD;
begin
   
GetWindowThreadProcessId(hwnd, dwID);
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;


function TerminateApp(const szProcess: String; dwTimeout: DWORD): DWORD;
var
   
hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    aBuf: array [0..259] of Char;
    szFileName, szDeviceName: String;
    tkp: TOKEN_PRIVILEGES;
    SeDebugNameValue: LUID;
    i, lpMemory, ret: Longint;
    lpThreadId, dwDrives: DWORD;
begin
   
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
       
pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
            if
CompareText(CharArrayToString(pe32.szExeFile), ExtractFileName(szProcess)) <> 0 then Continue;
            hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
            if hProc = TA_FAILED then
            begin
                if not
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                try
                   
tkp.PrivilegeCount := 1;
                    tkp.Privileges[0].Luid := SeDebugNameValue;
                    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
                    hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                    if hProc = TA_FAILED then Exit;
                finally
                   
tkp.Privileges[0].Attributes := 0;
                    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
                    CloseHandle(hToken);
                end;
            end;
            if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then
            begin
               
GetProcessImageFileName(hProc, aBuf[0], SizeOf(aBuf));
                szFileName := CharArrayToString(aBuf);
                dwDrives := GetLogicalDrives();
                for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
                begin
                   
QueryDosDevice(Format('%s:', [Chr(Ord('A') + i)]), aBuf[0], SizeOf(aBuf));
                    szDeviceName := CharArrayToString(aBuf);
                    if Pos(szDeviceName, szFileName) = 0 then Continue;
                    StringChangeEx(szFileName, szDeviceName, Format('%s:', [Chr(Ord('A') + i)]), True);
                    if CompareText(szProcess, szFileName) = 0 then Break;
                end;
                if CompareText(szProcess, szFileName) <> 0 then
                begin
                   
CloseHandle(hProc);
                    Continue;
                end;
            end;
            try
               
EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
                case WaitForSingleObject(hProc, dwTimeout) of
                   
WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                    WAIT_TIMEOUT: try
                       
lpProcName := GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitProcess');
                        if lpProcName = 0 then Exit;
                        lpMemory := VirtualAllocEx(hProc, 0, SizeOf(lpProcName), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                        if not WriteProcessMemory(hProc, lpMemory, lpProcName, SizeOf(lpProcName), ret) then Exit;
                        hThread := CreateRemoteThread(hProc, 0, 0, lpMemory, 0, 0, lpThreadId);
                        if hThread > 0 then
                        case
WaitForSingleObject(hThread, dwTimeout) of
                           
WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                            WAIT_TIMEOUT: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                        end;
                    finally
                       
CloseHandle(hThread);
                    end;
                end;
            finally
               
CloseHandle(hProc);
                if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then Exit;
            end;
        end;
    finally
       
CloseHandle(hProcessSnap);
    end;
end;


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;
var
   
pName: String;
begin
   
pName := 'calc.exe';
   
    Result := not IsProcessRunning(pName);
    if not Result then
    case
MsgBox('Обновляемое приложение запущено. Завершить работу приложения в принудительном режиме?' + #13#13 + '"Да" - завершение работы приложения и запуск установки.' + #13#10 + '"Нет" - выход из программы установки.', mbError, MB_YESNO) of
       
IDYES:
        begin
           
TerminateApp(pName, 5000);
            Result := True;
        end;
    end;
end;


PerfectLove 17-01-2014 06:00 2290673

Цитата:

Цитата saurn
Исправленный пример в моем предыдущем посте »

Все супер. Пришлось добавить ещё одно "end" после FindClose чтобы заработало. Спасибо огромное.
Есть ещё такой вопрос. Планирую перекинуть некоторые файлы на сервак. На данный момент файл или папка устанавливается только если выбран нужен компонент.
Встречал скрипт как закачивать файл с нета но я никак не могу связать с компонентами. Нужно так чтобы если компонент выбран происходила загрузка файла. Если возможно; файлы в .zip можно будет розпаковать?. Спс.

novahudonoser 17-01-2014 09:03 2290702

Цитата:

Цитата saurn
С этим кодом все в порядке. Просто вы компилируете на стандартной версии Inno. Установите расширенную версию от китайских собратьев, она есть в шапке соседней темы http://forum.oszone.net/showthread.php?p=1201499# , и проблема исчерпает себя. »

поставил рекомендуемую сборку, всё выполнил по инструкции из той шапки http://clip2net.com/s/6C14gJ
запустил злощастный код, вылезло следующее: http://clip2net.com/s/6C13Ab
дважды переставил и ANSI и UNICODE попробовал, что ж за беда то такая....

saurn 17-01-2014 09:14 2290705

Цитата:

Цитата PerfectLove
Есть ещё такой вопрос. Планирую перекинуть некоторые файлы на сервак. На данный момент файл или папка устанавливается только если выбран нужен компонент.
Встречал скрипт как закачивать файл с нета но я никак не могу связать с компонентами. Нужно так чтобы если компонент выбран происходила загрузка файла. Если возможно; файлы в .zip можно будет розпаковать?. Спс. »

Было несколько примеров по теме в этой ветке форума.

Цитата:

Цитата novahudonoser
запустил злощастный код, вылезло следующее »

Несовпадение параметров в файле сообщений. Что-то сделали не так. Вероятнее всего, он у вас от другой версии. Попробуйте версию, которой я пользуюсь is551e.7z. Замените файлами из архива содержимое папки Inno Setup 5, и попробуйте последний пример из этого поста http://forum.oszone.net/post-2290655-1860.html

novahudonoser 17-01-2014 09:21 2290708

saurn, крутяк!
скопировал из твоего архива Default.isl и всё заработало.
Огромное спасибо за помощь.

novahudonoser 17-01-2014 09:54 2290719

как на этапе установки MsgBox присвоить свой title текст?

а то сейчас там одно не информативное слово "Установка" http://clip2net.com/s/6C1B8x
Код:

function InitializeSetup(): Boolean;
begin
    Result := not IsProcessRunning('calc.exe');
    if not Result then MsgBox('Программа сейчас в работе'+ Chr(10)+'Закройте приложение выбрав пункт меню "Закрыть программу"'+ Chr(10)+'И повторите установку обновления.', mbError, MB_OK);
end;


saurn 17-01-2014 10:02 2290722

Цитата:

Цитата novahudonoser
как на этапе установки MsgBox присвоить свой title текст? »

Использовать системные MessageBox или форму MsgBoxEx из расширенной версии от китайцев:
Код:

MsgBoxEx(Application.Handle, 'Текст сообщения.', 'Заголовок формы', MB_YESNO or MB_ICONWARNING, 0, 0);
Системные MessageBox
Расширенный вариант от Johny777

novahudonoser 17-01-2014 11:36 2290777

а кто ещё подскажет как на этапе деинсталяции завершить процесс?
я пробовал пример из Inno Faq 1.4.chm используя ISTask.dll но она не робит, точней не находит процесс и деинсталяции проходит в нормальном режиме
Код:

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
// функции используемые при деинсталляции
// RunTask@{app}\ISTask.dll - название функции (в данном случае, если программа работает)
// и путь dll'ки где она расположена...

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('calc.exe', False) then
    begin
      // прячем форму
      UninstallProgressForm.Visible:= False;
      if MsgBox('Программа calc.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
        begin
          KillTask('calc.exe');
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          // показываем форму
          UninstallProgressForm.Visible:= True;
        end
      else
        begin
          MsgBox('Завершите работу calc.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          Abort;
        end;
    end;
end;


saurn 17-01-2014 11:50 2290789

Цитата:

Цитата novahudonoser
а кто ещё подскажет как на этапе деинсталяции завершить процесс? »

По тому же принципу, только выполнять завершение процесса следует в теле InitializeUninstall или на шаге usUninstall
Пример
Код:

#ifndef IS_ENHANCED
    #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif


[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


const
   
TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_VM_OPERATION = $8;
    PROCESS_VM_READ = $10;
    PROCESS_VM_WRITE = $20;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    MEM_COMMIT = $1000;
    MEM_RESERVE = $2000;
    PAGE_EXECUTE_READWRITE = $40;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    MAX_PATH = 260;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;


type
   
TPROCESSENTRY32 = record
       
dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of Char;
    end;

    LUID = record
       
LowPart: DWORD;
        HighPart: Longint;
    end;

    LUID_AND_ATTRIBUTES = record
       
Luid: LUID;
        Attributes: DWORD;
    end;

    TOKEN_PRIVILEGES = record
       
PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;


function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
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';
#endif
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';


function CharArrayToString(aChar: array of Char): String;
begin
   
Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;


function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
   
dwID: DWORD;
begin
   
GetWindowThreadProcessId(hwnd, dwID);
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;


function TerminateApp(const szProcess: String; dwTimeout: DWORD): DWORD;
var
   
hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    aBuf: array [0..259] of Char;
    szFileName, szDeviceName: String;
    tkp: TOKEN_PRIVILEGES;
    SeDebugNameValue: LUID;
    i, lpMemory, ret: Longint;
    lpThreadId, dwDrives: DWORD;
begin
   
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
       
pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
            if
CompareText(CharArrayToString(pe32.szExeFile), ExtractFileName(szProcess)) <> 0 then Continue;
            hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
            if hProc = TA_FAILED then
            begin
                if not
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                try
                   
tkp.PrivilegeCount := 1;
                    tkp.Privileges[0].Luid := SeDebugNameValue;
                    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
                    hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                    if hProc = TA_FAILED then Exit;
                finally
                   
tkp.Privileges[0].Attributes := 0;
                    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
                    CloseHandle(hToken);
                end;
            end;
            if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then
            begin
               
GetProcessImageFileName(hProc, aBuf[0], SizeOf(aBuf));
                szFileName := CharArrayToString(aBuf);
                dwDrives := GetLogicalDrives();
                for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
                begin
                   
QueryDosDevice(Format('%s:', [Chr(Ord('A') + i)]), aBuf[0], SizeOf(aBuf));
                    szDeviceName := CharArrayToString(aBuf);
                    if Pos(szDeviceName, szFileName) = 0 then Continue;
                    StringChangeEx(szFileName, szDeviceName, Format('%s:', [Chr(Ord('A') + i)]), True);
                    if CompareText(szProcess, szFileName) = 0 then Break;
                end;
                if CompareText(szProcess, szFileName) <> 0 then
                begin
                   
CloseHandle(hProc);
                    Continue;
                end;
            end;
            try
               
EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
                case WaitForSingleObject(hProc, dwTimeout) of
                   
WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                    WAIT_TIMEOUT: try
                       
lpProcName := GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitProcess');
                        if lpProcName = 0 then Exit;
                        lpMemory := VirtualAllocEx(hProc, 0, SizeOf(lpProcName), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                        if not WriteProcessMemory(hProc, lpMemory, lpProcName, SizeOf(lpProcName), ret) then Exit;
                        hThread := CreateRemoteThread(hProc, 0, 0, lpMemory, 0, 0, lpThreadId);
                        if hThread > 0 then
                        case
WaitForSingleObject(hThread, dwTimeout) of
                           
WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                            WAIT_TIMEOUT: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                        end;
                    finally
                       
CloseHandle(hThread);
                    end;
                end;
            finally
               
CloseHandle(hProc);
                if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then Exit;
            end;
        end;
    finally
       
CloseHandle(hProcessSnap);
    end;
end;


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 InitializeUninstall(): Boolean;
var
   
pName: String;
begin
   
pName := 'calc.exe';

    Result := not IsProcessRunning(pName);
    if not Result then
    begin
       
TerminateApp(pName, 5000);
        Result := True;
    end;
end;


vint56 17-01-2014 14:10 2290864

novahudonoser ISTask.dll работает только в ansi в unicode не работает

Mailchik 17-01-2014 19:08 2291020

ISTaskU.dll
Как-то давно скомпилил ISTask.dll от Genri для юникодовой Inno Setup.
Большой размер, из-за использования Delphi XE3.
читать дальше »
Код:

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

[Files]
Source: "ISTaskU.dll"; Flags: dontcopy;

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

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

function InitializeSetup(): Boolean;
begin
  If RunTask('aimp3.exe', false) then begin
    if MsgBox('Закрыть AIMP?', mbError, mb_YesNo) = idYes then begin
      KillTask('aimp3.exe');
      Result := True;
    end else
      Exit;
    end;
  Result := True;
end;


novahudonoser 18-01-2014 01:27 2291374

ребят, есть ещё одна задача которую мне не осилить, помогите плиз!
надо перед установкой проверять наличие REG_SZ ключа в реестре
путь к ключу HKEY_LOCAL_MACHINE\SOFTWARE\TimeCalculator http://clip2net.com/s/6CtciX
если ключ есть то:
> не показывать http://clip2net.com/s/6Ct3EB данную страницу, а путь для установки брать из ключа path и продолжать установку
если ключа нет то:
> продолжать установку в штатном режиме (со страницей выбора пути)

saurn 18-01-2014 05:07 2291436

Цитата:

Цитата novahudonoser
надо перед установкой проверять наличие REG_SZ ключа в реестре »

Пример
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={code:GetInstallDir}
OutputDir=.


[Code]
function GetInstallDir(const Default: String): String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\TimeCalculator', 'path', Result);
    if Result <> '' then RemoveBackslash(Result) else Result := ExpandConstant('{pf}\My Program');
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageID of
       
wpSelectDir: Result := RegValueExists(HKLM, 'SOFTWARE\TimeCalculator', 'path');
    end;
end;


novahudonoser 18-01-2014 10:05 2291467

при отсутствии ключа выдает http://clip2net.com/s/6Cxvf0

saurn 18-01-2014 10:08 2291469

Цитата:

Цитата novahudonoser
при отсутствии ключа выдает »

Потому что запускаете отладку в режиме деинсталяции. Скрипт проверен, и он тут ни причем.

novahudonoser 18-01-2014 10:22 2291473

ой, тупанул )
спасибо большое мил человек, всё работает!


ещё вопросы, если позволите:
1. как удалить тот ключ при деинсталяции

2. как вывести строковый Label на последней странице в котором была бы информация о используемом пути
а то в случае пропуска страницы с выбором пути - юзеру остаётся догадываться куда прога установилась

saurn 18-01-2014 10:50 2291484

Цитата:

Цитата novahudonoser
как удалить тот ключ при деинсталяции »

Код:

[Registry]
Root: HKLM; Subkey: SOFTWARE\TimeCalculator; Flags: dontcreatekey uninsdeletekey;

Цитата:

Цитата novahudonoser
как вывести строковый Label на последней странице в котором была бы информация о используемом пути
а то в случае пропуска страницы с выбором пути - юзеру остаётся догадываться куда прога установилась »

Тут необязательно что-то изобретать - путь установки будет отображен в ReadyMemo на странице готовности.

novahudonoser 18-01-2014 11:05 2291487

Цитата:

Цитата saurn
Тут необязательно что-то изобретать - путь установки будет отображен в ReadyMemo на странице готовности. »

я эту страницу не показываю изначально DisableReadyPage=yes
но впринципе её можно показать когда путь берётся из реестра, вопрос только как )

saurn 18-01-2014 11:26 2291503

Цитата:

Цитата novahudonoser
вопрос только как ) »

Например так:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={code:GetInstallDir}
OutputDir=.


[Code]
function GetInstallDir(const Default: String): String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\TimeCalculator', 'path', Result);
    if Result <> '' then RemoveBackslash(Result) else Result := ExpandConstant('{pf}\My Program');
end;


function ShouldSkipPage(PageID: Integer): Boolean;
var
   
ValueExists: Boolean;
begin
   
ValueExists := RegValueExists(HKLM, 'SOFTWARE\TimeCalculator', 'path');
   
    case PageID of
       
wpSelectDir: Result := ValueExists;
        wpReady: Result := not ValueExists;
    end;
end;


novahudonoser 18-01-2014 11:41 2291507

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

saurn 18-01-2014 11:47 2291509

novahudonoser, так вы DisableReadyPage=yes из секции Setup уберите

diman_21Ru 18-01-2014 12:06 2291515

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

nik1967 18-01-2014 12:15 2291520

novahudonoser, saurn, чё велосипед то изобретать?
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppName")}_is1,InstallLocation|{pf}\My Program}
OutputDir=.
DisableReadyPage=yes


novahudonoser 18-01-2014 12:25 2291525

saurn, так я её закоментил...
http://clip2net.com/s/6CzeTh

Цитата:

Цитата nik1967
novahudonoser, saurn, чё велосипед то изобретать? »

спасибо, но это не полностью решает задачу описанную выше... http://forum.oszone.net/post-2291507-1879.html

saurn 18-01-2014 13:01 2291543

nik1967, там, если ключ есть, нужно пропустить страницу выбора папки, так что все равно лезть в код, походя и поиск папки сделал через код, разница не велика.
novahudonoser, проверил еще раз http://forum.oszone.net/post-2291503-1878.html, все работает, как и положено.

novahudonoser 18-01-2014 17:04 2291661

Цитата:

Цитата saurn
все работает, как и положено. »

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

saurn 18-01-2014 17:14 2291669

novahudonoser, скрипт покажитте

novahudonoser 18-01-2014 17:23 2291677

Вложений: 1
пример

saurn 18-01-2014 17:53 2291695

novahudonoser, немножко допилил и причесал скрипт. Проверил: страницы пропускаются и показываются, как и требуется.
Скрипт
Код:

[Setup]
AppName=TimeCalculator
AppVerName=TimeCalculator
AppPublisher=zzz
OutputDir=.
OutputBaseFilename=TimeCalculator_1.8
DefaultDirName={code:GetInstallDir}
;AllowNoIcons=yes
DefaultGroupName=TimeCalculator
DisableStartupPrompt=yes
Compression=lzma
SolidCompression=yes
WizardImageFile=setup_2.bmp
WizardSmallImageFile=setup_1.bmp


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


[Files]
Source: "TimeCalculator.exe"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Flags: recursesubdirs
Source: "DataBaseEditor.exe"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Flags: recursesubdirs
Source: "help\TimeCalculator.chm"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Flags: recursesubdirs


[Tasks]
Name: desktopicon; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"


[Registry]
Root: HKLM; Subkey: SOFTWARE\TimeCalculator; Flags: dontcreatekey uninsdeletekey;


[Icons]
Name: "{group}\TimeCalculator"; Filename: "{app}\TimeCalculator.exe"; WorkingDir: "{app}"; IconFilename:"{app}\TimeCalculator.exe"
Name: "{group}\Справка"; Filename: "{app}\TimeCalculator.chm"
Name: "{group}\Удалить программу"; Filename: "{uninstallexe}"
Name: "{userdesktop}\TimeCalculator"; Filename: "{app}\TimeCalculator.exe"; WorkingDir: "{app}"; IconFilename:"{app}\TimeCalculator.exe"; Tasks: desktopicon


[Run]
Filename: "{app}\TimeCalculator.exe"; Description: "Запустить программу"; Flags: nowait postinstall skipifsilent
Filename: "{app}\TimeCalculator.chm"; Description: "Открыть справку"; Flags: shellexec nowait postinstall skipifsilent


[InstallDelete]
Type: files; Name: "{app}\TimeCalculator.exe"
Type: files; Name: "{app}\TimeCalculator.chm"
Type: files; Name: "{app}\DataBaseEditor.exe"


[UninstallDelete]
Type: files; Name: "{app}\TimeCalculator.exe"
Type: files; Name: "{app}\TimeCalculator.tcs"
Type: files; Name: "{app}\TimeCalculator.chm"
Type: files; Name: "{app}\DataBaseEditor.exe"


[Code]
var
   
ValueExists: Boolean;
   
   
// функция обнаружения запущенного процесса
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 GetInstallDir(const Default: String): String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\TimeCalculator', 'path', Result);
    if Result <> '' then RemoveBackslash(Result) else Result := ExpandConstant('{pf}\TimeCalculator');
end;


// на этапе установки проверяем запущен ли определённый процесс, если запущен - отменяем установку и выводим месейдж
function InitializeSetup(): Boolean;
begin
   
Result := not IsProcessRunning('TimeCalculator.exe');
  if not Result then MsgBoxEx(Application.Handle, 'Программа TimeCalculator запущена!'+ Chr(10)+'Закройте приложение выбрав пункт меню "Закрыть программу"'+ Chr(10)+'И повторите установку обновления.', 'Установка обновления отменена', $10, 0, 0);
end;


procedure RedesignWizardForm;
begin
    with
TLabel.Create(nil) do
    begin
       
Parent := WizardForm.WelcomePage;
        SetBounds(ScaleX(426), ScaleY(288), ScaleX(51), ScaleY(13));
        Caption := '© zzz';
    end;
   
    WizardForm.WelcomeLabel2.Height := ScaleY(207);
    WizardForm.RunList.Height := ScaleY(107);
end;


procedure InitializeWizard();
begin
   
RedesignWizardForm;
end;


// если путь из ключа выбран - пропускаем страницу с выбором пути
function ShouldSkipPage(PageID: Integer): Boolean;
begin
   
ValueExists := RegValueExists(HKLM, 'SOFTWARE\TimeCalculator', 'path');
    case PageID of
       
wpSelectDir: Result := ValueExists;
        wpReady: Result := not ValueExists;
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
CurPageID of
       
wpSelectTasks: if ValueExists then WizardForm.NextButton.Caption := SetupMessage(msgButtonNext) else WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
    end;
end;


// на этапе деинсталяции проверяем запущен ли определённый процесс, если запущен - отменяем деинсталяцию и выводим месейдж
function InitializeUninstall(): Boolean;
begin
   
Result := not IsProcessRunning('TimeCalculator.exe');
    if not Result then MsgBoxEx(Application.Handle, 'Программа TimeCalculator запущена!'+ Chr(10)+'Закройте приложение выбрав пункт меню "Закрыть программу"'+ Chr(10)+'И запустите процесс деинсталяции заново.', 'Деинсталяция отменена', $10, 0, 0);
end;


novahudonoser 18-01-2014 18:12 2291710

да, теперь работает всё как надо!
большое тебе человеческое спасибо saurn не знаю как по батюшки.
в чём был косяк полагаю спрашивать бесполезно...

saurn 18-01-2014 18:44 2291725

Цитата:

Цитата novahudonoser
в чём был косяк полагаю спрашивать бесполезно... »

В этом: DisableReadyPage=yes. Изначально в секции Setup был задан пропуск страницы готовности, это глобальный параметр.

novahudonoser 18-01-2014 18:56 2291733

я перед постом скрипта по ошибке закоментил не то
так то он был выключен, я уже показывал скрин http://clip2net.com/s/6CzeTh
вообщем пофик, ещё раз спасибо за терпение и потраченное время.

Ivan_009 19-01-2014 10:04 2292009

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

diman_21Ru 19-01-2014 11:40 2292028

Здарова всем я взял Bass и поставил на свой скрипт музыка играет но как можно добавить кнопку вкл\выкл , кто знает ответьте зарание спасибо :)

Ivan_009 19-01-2014 14:21 2292090

diman_21Ru,

Покажи скрипт

diman_21Ru 19-01-2014 14:52 2292100

я в личку кину тебе

Ivan_009 19-01-2014 16:23 2292158

diman_21Ru, Куда прикрутить вверх или низ

diman_21Ru 19-01-2014 16:33 2292163

в верх наверное

sergey3695 19-01-2014 16:33 2292166

Цитата:

Цитата Ivan_009
Как через ботву наложить Edit чтобы можно было выделять покажите пожалуйста пример »

Никак. Ботва накладывает картинку. Если только поверх картинки накладывать edit...

Ivan_009 19-01-2014 16:45 2292173

Цитата:

Цитата sergey3695
Никак. Ботва накладывает картинку. Если только поверх картинки накладывать edit... »

sergey3695, Можно пример

diman_21Ru 19-01-2014 16:52 2292178

Ivan_009,ну как готово чтоли для меня там :)

Ivan_009 19-01-2014 16:57 2292180

diman_21Ru, В личке

vint56 19-01-2014 17:04 2292187

Ivan_009 edit можно наложить на картинку только за чем он же не прозрачный и смысла нету это делать

Ivan_009 19-01-2014 17:13 2292196

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

Или только через ISPicture2 можно...

Ivan_009 19-01-2014 21:52 2292394

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

Nordek 20-01-2014 01:07 2292520

Цитата:

Цитата diman_21Ru
музыка играет но как можно добавить кнопку вкл\выкл »

Для нуждающихся BASS v.1.4

P.S diman_21Ru, Пробуй иногда пользоваться поиском.

novahudonoser 20-01-2014 13:04 2292682

всем привет! два вопросика:
1. как отключить регистрацию в списке установленных программ и формирование unins000.dat unins000.exe файлов
(нужен инсталятор чтобы только распаковал файлы в нужном месте и без "свидетелей", путь копирования файлов берётся из ключа в реестре)
2. если ключа нет - выводим мессейдж:
Код:

function GetInstallDir(const Default: String): String;
begin
    RegQueryStringValue(HKLM, 'SOFTWARE\TimeCalculator', 'path', Result);
    if Result <> '' then RemoveBackslash(Result) else MsgBoxEx(Application.Handle, 'блаблабла', 'Установка отменена', $10, 0, 0);
end;

и в этот момент надо прервать процесс установки, как?

Mailchik 20-01-2014 14:18 2292718

novahudonoser,
1.
читать дальше »
Код:

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


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

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={code:GetInstallDir}

[Code]
var
  sPath: string;

function GetInstallDir(const Default: String): String;
begin
  Result := RemoveBackslash(sPath);
end;

function InitializeSetup(): boolean;
begin
  Result := RegQueryStringValue(HKCU, 'SOFTWARE\7-Zip', 'Path', sPath);
  if not Result then
    MsgBoxEx(Application.Handle, 'блаблабла', 'Установка отменена', $10, 0, 0);
end;


novahudonoser 20-01-2014 16:48 2292812

Mailchik, спасибо
только при обнаружении ключа, инсталер показывает ReadyPage http://clip2net.com/s/6DuYQR
чего хотелось бы избежать

ранее saurn мне подсказывал на этот счёт
Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
    ValueExists := RegValueExists(HKLM, 'SOFTWARE\TimeCalculator', 'path');
    case PageID of
        wpSelectDir: Result := ValueExists;
        wpReady: Result := not ValueExists;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
    case CurPageID of
        wpSelectTasks: if ValueExists then WizardForm.NextButton.Caption := SetupMessage(msgButtonNext) else WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
    end;
end;

но в купе с Вашим кодом - страница таки не игнорится, подскажите в чём проблема?

saurn 20-01-2014 16:54 2292818

novahudonoser,
Код:

[Setup]
DisableReadyPage=yes

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

novahudonoser 20-01-2014 17:03 2292825

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

вот код, и всё вроде так, а страница таки вылезает
Код:

[Setup]
AppName=Update TimeCalculator
AppVerName=Update TimeCalculator
OutputDir=output\
OutputBaseFilename=Update_1.8
DefaultDirName={code:GetInstallDir}
AllowNoIcons=yes
DisableReadyPage=yes
DisableWelcomePage=yes
DisableStartupPrompt=yes
DisableFinishedPage=yes
Uninstallable=no
Compression=lzma
SolidCompression=yes

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

[Files]
Source: "update_TimeCalculator.exe"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Flags: recursesubdirs
Source: "help\TimeCalculator.chm"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Flags: recursesubdirs

*Code]  // скобку заменил звездой из-за форума

var
  sPath: string;

function GetInstallDir(const Default: String): String;
begin
  Result := RemoveBackslash(sPath);
end;

function InitializeSetup(): boolean;
begin
  Result := RegQueryStringValue(HKLM, 'SOFTWARE\TimeCalculator', 'Path', sPath);
  if not Result then
    MsgBoxEx(Application.Handle, 'Программа TimeCalculator не инициализирована!'+ Chr(10)+'Запустите программу и повторите установку обновления.', 'Установка обновления отменена', $10, 0, 0);
end;


novahudonoser 20-01-2014 17:56 2292868

http://clip2net.com/s/6DxkSU

хотелось вообще не видеть окон инсталятора, это возможно?

.

novahudonoser 20-01-2014 18:33 2292898

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

saurn 20-01-2014 18:44 2292905

Цитата:

Цитата novahudonoser
да, только месейдж при условии отсутствия ключа »

Пример
Код:

[Setup]
AppName=Update TimeCalculator
AppVerName=Update TimeCalculator
OutputDir=output\
OutputBaseFilename=Update_1.8
DefaultDirName={reg:HKLM\SOFTWARE\TimeCalculator,Path}
AllowNoIcons=yes
Uninstallable=no
Compression=lzma
SolidCompression=yes


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


[Files]
Source: "update_TimeCalculator.exe"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Flags: recursesubdirs
Source: "help\TimeCalculator.chm"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Flags: recursesubdirs


[Code]
const
   
BM_CLICK = $00F5;
   
   
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL;
    external 'ShowWindow@user32.dll stdcall';
   
   
function InitializeSetup(): Boolean;
begin
   
Result := RegValueExists(HKLM, 'SOFTWARE\TimeCalculator', 'path');
    if not Result then MsgBoxEx(Application.Handle, 'Программа TimeCalculator не инициализирована!'+ Chr(10)+'Запустите программу и повторите установку обновления.', 'Установка обновления отменена', $10, 0, 0);
end;


procedure CurPageChanged(CurPageID: Integer);
begin
   
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), SW_HIDE); //Закоментировать, если нужно отображать страницу установки.
   
PostMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;



P. S.
В шапке темы есть пример.

novahudonoser 20-01-2014 18:56 2292919

беда... http://clip2net.com/s/6DzikK
всё из-за появляющегося диалога http://clip2net.com/s/6Dzm7J
если ответить нет - то инсталятор не выгружается
можно сделать чтобы вопросов вообще не возникало?

saurn 20-01-2014 19:05 2292921

Цитата:

Цитата novahudonoser
можно сделать чтобы вопросов вообще не возникало? »

Код:

[Setup]
DirExistsWarning=no


habib2302 22-01-2014 22:52 2294423

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

[Tasks]
Name: icons; Description: {cm:AdditionalIcons}; Components: UISO\instal;
Name: icons\desktop; Description: {cm:CreateDesktopIcon}; Components: UISO\instal;
Name: icons\group; Description: {cm:CreateGroupIcon}; Components: UISO\instal;
Name: icons\quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; OnlyBelowVersion: 0,6.1; Components: UISO\instal;
Name: icons\taskbaricon; Description: {cm:CreateQuickLaunchIcon}; MinVersion: 0.0,6.1.7600; Components: UISO\instal; Flags: unchecked;
Name: associate; Description: Ассоциировать .iso файл с UltraISO; MinVersion: 0.0,5.0; Components: UISO\instal;
Name: isodrive; Description: Установить ISO CD/DVD эмулятор (ISODrive); MinVersion: 0.0,5.0; Components: UISO\instal;

[Components]
Name: UltraISO; Description: {#MyAppName}; Flags: fixed; Types: full;
Name: UISO\instal; Description: Установить {#MyAppName}; Flags: exclusive
Name: UISO\Portable; Description: Распаковать {#MyAppName}; Flags: exclusive
Name: InterfaceLang; Description: {cm:InterfaceLang}; Flags: fixed; Types: full;
Name: InterfaceLang\ru; Description: Русский; Flags: exclusive;
Name: InterfaceLang\en; Description: Английский; Flags: exclusive;
Name: InterfaceLang\ua; Description: Украинский; Flags: exclusive;

[Registry]
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: Language; ValueType: String; ValueData: 1033; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\en";
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: Language; ValueType: String; ValueData: 1049; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\ru";
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: Language; ValueType: String; ValueData: 1058; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\ua";
Root: HKCR; SubKey: UltraISO; ValueType: String; ValueData: "UltraISO File"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\en";
Root: HKCR; SubKey: UltraISO; ValueType: String; ValueData: "Файл UltraISO"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\ru";
Root: HKCR; SubKey: UltraISO; ValueType: String; ValueData: "UltraISO файл"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\ua";
Root: HKCR; SubKey: UltraISO\shell\open; ValueType: String; ValueData: "Open with &UltraISO"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\en";
Root: HKCR; SubKey: UltraISO\shell\open; ValueType: String; ValueData: "Открыть используя &UltraISO"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\ru";
Root: HKCR; SubKey: UltraISO\shell\open; ValueType: String; ValueData: "Відкрити з &UltraISO"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey; Components: "UISO\instal InterfaceLang\ua";

[Ini]
Filename: {app}\uikey.ini; Section: UltraISO; Key: UserName; String: 'Xabib'; Components: UISO\Portable; Flags: UninsDeleteEntry;
Filename: {app}\uikey.ini; Section: UltraISO; Key: Registration; String: '7CAA-64E2-CCC5-5885'; Components: UISO\Portable; Flags: UninsDeleteEntry;
Filename: {app}\uikey.ini; Section: UltraISO; Key: Language; String: 'Russian'; Components: "UISO\Portable InterfaceLang\ru"; Flags: UninsDeleteEntry;
Filename: {app}\uikey.ini; Section: UltraISO; Key: Language; string: 'English'; Components: "UISO\Portable InterfaceLang\en"; Flags: UninsDeleteEntry;
Filename: {app}\uikey.ini; Section: UltraISO; Key: Language; string: 'Ukrainian'; Components: "UISO\Portable InterfaceLang\ua"; Flags: UninsDeleteEntry;


saurn 23-01-2014 10:44 2294584

Цитата:

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

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

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


[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: comps1;
Source: C:\Windows\Fonts\*; DestDir: {app}; Flags: external; Components: comps2;


[Components]
Name: comps1; Description: Компонент 1; Types: full;
Name: comps2; Description: Компонент 2; Types: full;


[code]
function UninsPreInstall(): Boolean;
var
   
Buff, Name: String;
    i: Integer;
begin
   
Result := IsComponentSelected('comps1');
    if Result then Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
    if not Result then Result := not FileExists(RemoveQuotes(Buff));
    if not Result then
    begin
       
RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'DisplayName', Name );
        WizardForm.StatusLabel.Caption := 'Удаление' + #32 + Name;
        Exec(RemoveQuotes(Buff), '/VERYSILENT', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall: UninsPreInstall();
    end;
end;


Ivan_009 23-01-2014 18:17 2294862

Как обьединить в одну страницу

nik1967 23-01-2014 19:35 2294915

Ivan_009, использовать вместо Tasks - Components (то есть в секции Components разместить нужные задачи). Ну или сделать родителем для элементов Components - SelectTasksPage.

Ivan_009 23-01-2014 20:56 2294966

Как через ботву наложить такую форму чтобы зеленые края потом были прозрачные

habib2302 24-01-2014 11:34 2295184

доброе время суток.как сделать чтобы при выборе компонента portable не вносились изменения в реестр в самом APPID на 1 скрине
и чтобы не появлялись подобные сообщения на 2 скрине

Shkutu 24-01-2014 12:57 2295226

Цитата:

Цитата habib2302
чтобы не появлялись подобные сообщения »

Прописать у компонента флаг
Код:

[Components]
Name: CCleanerBusiness; Description:CCleanerBusiness; Flags: disablenouninstallwarning


saurn 24-01-2014 13:04 2295228

Цитата:

Цитата habib2302
доброе время суток.как сделать чтобы при выборе компонента portable не вносились изменения в реестр в самом APPID на 1 скрине
и чтобы не появлялись подобные сообщения на 2 скрине »

Код:

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

;Создание ключа деинсталляции в зависимости от выбранного компонента
CreateUninstallRegKey=not IsComponentSelected('portable')

;Или так, если деинсталятор не нужен совсем
;Uninstallable=not IsComponentSelected('portable')

AppId=MyApp


[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: portable;
Source: C:\Windows\Fonts\*; DestDir: {app}; Flags: external; Components: normal;


[Components]
Name: portable; Description: Портативная; Flags: exclusive; Types: full;

;Флаг disablenouninstallwarning указывает инсталлятору не предупредить пользователя, что этот компонент не
;удалится после того, как он снимет с него флажок, если этот компонент уже установлен на данном компьютере.
Name: normal; Description: Обычная; Flags: exclusive disablenouninstallwarning;

Читаем справку.

Shkutu 24-01-2014 16:55 2295386

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

saurn 24-01-2014 17:29 2295419

Shkutu, на скорую руку в голову пришел такой вариант:
читать дальше »
Код:

const
   
PARAM1 = ' -folder1';
    PARAM2 = ' -folder2';
    PARAM3 = ' -folder3';
   
   
function CheckParam(const nInput: Integer): Boolean;
begin
    case
nInput of
       
0: Result := Pos(PARAM1, GetCmdTail) <> 0;
        1: Result := Pos(PARAM2, GetCmdTail) <> 0;
        2: Result := Pos(PARAM3, GetCmdTail) <> 0;
    end;
end;


procedure InitializeWizard();
begin
    if
CheckParam(0) then WizardForm.DirEdit.Text := PARAM1;
    if CheckParam(1) then WizardForm.DirEdit.Text := PARAM2;
    if CheckParam(2) then WizardForm.DirEdit.Text := PARAM3;
end;


Уверен, можно сделать и лучше.

Shkutu 24-01-2014 17:59 2295443

saurn, если я правильно поняла - это не совсем то, что мне нужно. Ваш способ все равно ведь предполагает задание значений необходимых параметров в коде (хотя и более вариативно, чем использование 1 значения по умолчанию). А требуется, чтобы в качестве значение параметра мог задать сам пользователь по своему усмотрению.
Хотя сама идея просто парсить GetCmdTail может помочь, спасибо:)
А вот еще вопрос. Можно ли запускать компиляцию инно скриптов через командную строку? Пробовала просто Compil32.exe <script.iis> - но в этом случае скрипт просто открывается
UPD. С компиляцией из командной строки уже разобралась. Оказывается, просто ключа "/сс" не хватало. Все-таки у инно довольно подробная справка:)

saurn 24-01-2014 18:35 2295482

Shkutu, не сразу понял, что вам нужно :)
читать дальше »
Код:

function CMDCheck(): String;
var
  i: Integer;
begin
    for i := 0 to ParamCount do Result := ParamStr(i);
end;


procedure InitializeWizard();
begin
    WizardForm.DirEdit.Text := CMDCheck();
end;


Проверяйте корректность выполнения.

Shkutu 24-01-2014 18:38 2295486

saurn, да, спасибо, как раз тоже про ParamStr подумала :)

TAY50N 24-01-2014 20:45 2295586

Здравствуйте форумчане! Подскажите, пожалуйста, как осуществить соединение 2-х страниц:
читать дальше »
#define NeedVers "8.10"
[Setup]
AppName=TAY50N_mods
AppVersion=8.0
AppVerName=TAY50N_mods_8.0
DefaultDirName=C:\Games\World_of_Tanks
DefaultGroupName=TAY50N_mods
DirExistsWarning=no
AllowNoIcons=yes
AppPublisher=DEFIR
AppPublisherURL=defir.uniogame.com
AppCopyright=Copyright (C) TAY50N_mods
OutputBaseFilename=setup
WizardImageFile=InstallFiles\WizardImage.bmp
WizardSmallImageFile=InstallFiles\WizardSmallImage.bmp
SetupIconFile=InstallFiles\DEFIR.ico

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


[Types]
Name: custom; Description: Custom installation; Flags: iscustom

[Components]
Name: a; Description: Удаляем видео заставку;
Name: b; Description: "Часы в Ангаре";
Name: c; Description: Выберите Прицел;
Name: c\1; Description: "от zayaz"; Flags: exclusive;
Name: c\2; Description: "от ZCH_0933"; Flags: exclusive;
Name: c\3; Description: "от dab97"; Flags: exclusive;
Name: c\4; Description: "Бирюза"; Flags: exclusive;
Name: c\5; Description: "Анимированый"; Flags: exclusive;
;Name: d; Description: "УГН";
;Name: e; Description: "ZoomMod + ZoomX";
;Name: q; Description: "Стандартные Звуки (папка Audio)";
;Name: f; Description: "Зоны пробития";
;Name: g; Description: "Белые трупы танков";
;Name: h; Description: "Уведомление союзников о засвете";
;Name: i; Description: "Прозрачный чат";
;Name: j; Description: "Дамаг Индикатор";
;Name: k; Description: Выберите Ангар;
;Name: k\1; Description: "«8 ноября»"; Flags: exclusive;
;Name: k\2; Description: "«Мастерская WG»"; Flags: exclusive;
;Name: l; Description: "Иконки";
;Name: m; Description: "Информативная панель";
;Name: o; Description: "Меню рамашка от TRJ-VoRoN";
;Name: p; Description: "Понель повреждений";
;Name: r; Description: "Статистика за сессию";
;Name: s; Description: "Список грядущих боёв на ГК";
;Name: t; Description: "Танки в два ряда";
;Name: y; Description: "XVM (Олень)";
;Name: u; Description: "Фокус";
;Name: w; Description: "Отображение оверлея (TS_Mumble_RaidCall)";
;Name: x; Description: "Максимальное увеличение дальности видимости";
;Name: z; Description: "Звуковой мод Громовые орудия, версия 1.6";
;Name: n; Description: "Реалистичная озвучка экипажа";
;Name: b1; Description: "Убираем облака";

[Files]
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\isskin.dll"; DestDir: "{app}"; Flags: ignoreversion; Attribs: hidden system;
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\Tiger.cjstyles"; DestDir: "{app}"; Flags: ignoreversion; Attribs: hidden system;
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\WizardImage.bmp"; DestDir: "{app}"; Flags: ignoreversion; Attribs: hidden system;
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\WizardSmallImage.bmp"; DestDir: "{app}"; Flags: ignoreversion; Attribs: hidden system;
Source: "C:\Games\World_of_Tanks\MODS\01. Удаляем видео заставку (INTRO)\*"; DestDir: {app}\res_mods\; Flags: ignoreversion createallsubdirs recursesubdirs; Components: a;
Source: "C:\Games\World_of_Tanks\MODS\02. Часы в Ангаре\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: b;
Source: "C:\Games\World_of_Tanks\MODS\03.1 Прицел zayaz\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\1;
Source: "C:\Games\World_of_Tanks\MODS\03.2 Прицел ZCH_0933\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\2;
Source: "C:\Games\World_of_Tanks\MODS\03.3 Прицел от dab97\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\3;
Source: "C:\Games\World_of_Tanks\MODS\03.4 Прицел Бирюза\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\4;
Source: "C:\Games\World_of_Tanks\MODS\03.5 Прицел анимированый\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\5;
;Source: "C:\Games\World_of_Tanks\MODS\04. УГН\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: d;
;Source: "C:\Games\World_of_Tanks\MODS\05. ZoomMod + ZoomX\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: e;
;Source: "C:\Games\World_of_Tanks\MODS\06. Звуки Стандартные (папка Audio)\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: q;
;Source: "C:\Games\World_of_Tanks\MODS\07. Зоны пробития\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: f;
;Source: "C:\Games\World_of_Tanks\MODS\08. Белые трупы танков\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: g;
;Source: "C:\Games\World_of_Tanks\MODS\09. Уведомление союзников о засвете\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: h;
;Source: "C:\Games\World_of_Tanks\MODS\10. Прозрачный чат\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: i;
;Source: "C:\Games\World_of_Tanks\MODS\11. Дамаг Индикатор\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: j;
;Source: "C:\Games\World_of_Tanks\MODS\12.1 Ангар «8 ноября»\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: k\1;
;Source: "C:\Games\World_of_Tanks\MODS\12.2 Ангар «Мастерская WG»\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: k\2;
;Source: "C:\Games\World_of_Tanks\MODS\13. Иконки\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: l;
;Source: "C:\Games\World_of_Tanks\MODS\14. Информативная панель\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: m;
;Source: "C:\Games\World_of_Tanks\MODS\16. Меню рамашка от TRJ-VoRoN\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: o;
;Source: "C:\Games\World_of_Tanks\MODS\17. Понель повреждений\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: p;
;Source: "C:\Games\World_of_Tanks\MODS\18. Статистика за сессию\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: r;
;Source: "C:\Games\World_of_Tanks\MODS\19. Список грядущих боёв на ГК\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: s;
;Source: "C:\Games\World_of_Tanks\MODS\20. Танки в два ряда\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: t;
;Source: "C:\Games\World_of_Tanks\MODS\21. XVM (Олень)\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: y;
;Source: "C:\Games\World_of_Tanks\MODS\22. Фокус\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: u;
;Source: "C:\Games\World_of_Tanks\MODS\23. Отображение оверлея (TS_Mumble_RaidCall)\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: w;
;Source: "C:\Games\World_of_Tanks\MODS\24. Максимальное увеличение дальности видимости\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: x;
;Source: "C:\Games\World_of_Tanks\MODS\25. Звуковой мод Громовые орудия, версия 1.6\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: z;
;Source: "C:\Games\World_of_Tanks\MODS\26. Реалистичная озвучка экипажа\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: n;
;Source: "C:\Games\World_of_Tanks\MODS\27. Убираем облака\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: b1;

[Registry]
Root: HKLM; Subkey: "Software\TAY50N_mods\Version"; ValueType: string; ValueName: "Version"; ValueData: "8.0"; Flags: uninsdeletekey

[code]
var
SystemPage: TWizardPage;
ModNameLabel: TNewStaticText;
MouseLabel, SiteLabel: TLabel;

GamePathPanel, GameVersPanel, GameModPanel: TPanel;
FindGamePath, FindGameVers, FindGameMod, ReqSatisfy: TNewStaticText;
GamePathMemo, GameVersMemo, GameModMemo, GamePathFindMemo, GameVersFindMemo, GameModFindMemo: TPanel;
RenameCheckBox: TNewCheckBox;

//процедуры, для использования скина (Tiger.cjstyles)
procedure LoadSkin(lpszPath: PAnsiChar; lpszIniFileName: PAnsiChar); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload';
procedure UnloadSkin; external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

//процедуры, которые выполняются при наведении на ссылку (левый нижний угол)
procedure SiteLabelOnClick(Sender: TObject); var ErrorCode: Integer;
begin
ShellExec('open', 'http:\\defir.uniogame.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 := WizardForm.Font.Color;
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color := clRed;
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color := WizardForm.Font.Color;
end;

procedure RedesignWizardForm;
begin
with WizardForm do
begin
Color := clBlack;
WelcomePage.Color := clBlack;
FinishedPage.Color := clBlack;
Font.Color := clWhite;
Font.Style := [fsBold];
Font.Size := 9;
ClientWidth := ScaleX(690);
ClientHeight := ScaleY(459);
Caption := ExpandConstant('{#SetupSetting("AppName")}');
Center;
end;

with WizardForm.OuterNotebook do
begin
SetBounds(ScaleX(223), ScaleY(60), ScaleX(467), ScaleY(350));
end;

with WizardForm.InnerNotebook do
begin
SetBounds(WizardForm.InnerNotebook.Left - ScaleX(25), ScaleY(50), ScaleX(420), ScaleY(260));
end;

with WizardForm.InnerPage do
begin
Color := clBlack;
end;

with WizardForm.Bevel do
begin
SetBounds(ScaleX(0), ScaleY(410), ScaleX(690), ScaleY(2));
end;

with WizardForm.Bevel1 do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(58), ScaleX(690), ScaleY(2));
end;

with WizardForm.MainPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(690), ScaleY(58));
end;

with WizardForm.WizardSmallBitmapImage do
begin
Left := ScaleX(633);
end;

with WizardForm.CancelButton do
begin
Left := ScaleX(590);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.NextButton do
begin
Left := ScaleX(500);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.BackButton do
begin
Left := ScaleX(410);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.ReadyMemo do
begin
SetBounds(ScaleX(0), ScaleY(30), ScaleX(417), ScaleY(220));
end;

ModNameLabel := TNewStaticText.Create(WizardForm);
with ModNameLabel do
begin
Parent := WizardForm.MainPanel;
Font.Size := 22;
Font.Name := 'Courier New';
Font.Style := [fsBold];
Font.Color := clWindowText;
SetBounds(ScaleX(50), ScaleY(15), ScaleX(200), ScaleY(50));
Caption := ExpandConstant('{#SetupSetting("AppName")}');
end;

MouseLabel := TLabel.Create(WizardForm);
with MouseLabel do
begin
Parent := WizardForm;
Width := WizardForm.Width;
Height := WizardForm.Height;
Autosize := False;
Transparent := True;
OnMouseMove := @SiteLabelMouseMove2;
end;

SiteLabel := TLabel.Create(WizardForm);
with SiteLabel do
begin
Caption := ExpandConstant('{#SetupSetting("AppPublisherURL")}');
Parent := WizardForm;
Left := ScaleX(15);
Top := ScaleY(425);
Font.Name := 'Courier New';
Cursor := crHand;
OnClick := @SiteLabelOnClick;
OnMouseDown := @SiteLabelMouseDown;
OnMouseUp := @SiteLabelMouseUp;
OnMouseMove := @SiteLabelMouseMove;
end;
end;

//************************************************ [Начало - Компоненты страниц] ***************************************************//

////////////////////// WelcomePage //////////////////////

procedure CreatePageComponents;
begin

with WizardForm.WizardBitmapImage do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
end;

with TLabel.Create(WizardForm) do
begin
Caption := WizardForm.WelcomeLabel1.Caption;
Parent := WizardForm.WelcomePage;
Alignment := taCenter;
AutoSize := False;
Wordwrap := True;
Font.Name := 'Courier New';
Font.Size := 14;
Font.Style := [fsBold];
Transparent := True;
SetBounds(ScaleX(30), ScaleY(45), ScaleX(407), ScaleY(45));
end;

with WizardForm.WelcomeLabel2 do
begin
Font.Name := 'Courier New';
SetBounds(ScaleX(30), ScaleY(140), ScaleX(407), ScaleY(239));
end;

////////////////////// WelcomePage //////////////////////

with WizardForm.PageNameLabel do
begin
Height := ScaleY(20);
Font.Name := 'Courier New';
Font.Size := 12;
Font.Color := WizardForm.Font.Color;
end;

with WizardForm.PageDescriptionLabel do
begin
Top := WizardForm.PageDescriptionLabel.Top + ScaleY(8);
Height := ScaleY(15);
Width := ScaleX(500);
Font.Name := 'Courier New';
end;

////////////////////// SelectDirPage //////////////////////

WizardForm.SelectDirLabel.Font.Name := 'Courier New';

with WizardForm.SelectDirBrowseLabel do
begin
Height := ScaleY(30);
Font.Name := 'Courier New';
end;

with WizardForm.DirEdit do
begin
Top := ScaleY(100);
Font.Name := 'Courier New';
Font.Size := 8;
end;

with WizardForm.DirBrowseButton do
begin
Top := ScaleY(99);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.DiskSpaceLabel do
begin
Top := ScaleY(245);
Font.Name := 'Courier New';
end;

////////////////////// SelectDirPage //////////////////////

////////////////////// SelectComponentsPage //////////////////////

with WizardForm.SelectComponentsLabel do
begin
Height := ScaleY(30);
Font.Name := 'Courier New';
end;

with WizardForm.TypesCombo do
begin
Top := ScaleY(45);
Font.Name := 'Courier New';
end;

with WizardForm.ComponentsList do
begin
Top := ScaleY(80);
Height := ScaleY(155);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.ComponentsDiskSpaceLabel do
begin
Top := ScaleY(245);
Font.Name := 'Courier New';
end;

////////////////////// SelectComponentsPage //////////////////////

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

with WizardForm.SelectStartMenuFolderLabel do
begin
Font.Name := 'Courier New';
end;

with WizardForm.SelectStartMenuFolderBrowseLabel do
begin
Height := ScaleY(30);
Font.Name := 'Courier New';
end;

with WizardForm.GroupEdit do
begin
Top := ScaleY(100);
Font.Name := 'Courier New';
Font.Size := 8;
end;

with WizardForm.GroupBrowseButton do
begin
Top := ScaleY(99);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.NoIconsCheck do
begin
Top := ScaleY(245);
Font.Name := 'Courier New';
Width := ScaleX(250);
end;

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

////////////////////// ReadyPage //////////////////////

WizardForm.ReadyLabel.Font.Name := 'Courier New';
WizardForm.ReadyMemo.Font.Name := 'Courier New';

////////////////////// ReadyPage //////////////////////

////////////////////// InstallingPage //////////////////////

WizardForm.StatusLabel.Font.Name := 'Courier New';
WizardForm.ProgressGauge.SetBounds(ScaleX(0), ScaleY(60), ScaleX(417), ScaleY(30));

with WizardForm.FilenameLabel do
begin
Top := ScaleY(20);
Font.Name := 'Courier New';
Font.Style := [];
end;

////////////////////// InstallingPage //////////////////////

////////////////////// FinishedPage //////////////////////

with WizardForm.WizardBitmapImage2 do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
end;

with TLabel.Create(WizardForm) do
begin
Caption := WizardForm.FinishedHeadingLabel.Caption;
Parent := WizardForm.FinishedPage;
Alignment := taCenter;
AutoSize := False;
Wordwrap := True;
Font.Name := 'Courier New';
Font.Size := 14;
Font.Style := [fsBold];
Transparent := True;
SetBounds(ScaleX(30), ScaleY(45), ScaleX(407), ScaleY(45));
end;

with WizardForm.FinishedLabel do
begin
Font.Name := 'Courier New';
SetBounds(ScaleX(30), ScaleY(130), ScaleX(407), ScaleY(239));
end;
end;

////////////////////// FinishedPage //////////////////////

////////////////////// UninstallingPage //////////////////////

procedure RedesignUninstallProgressForm;
var
UninstallBitmapImage: TBitmapImage;
begin
with UninstallProgressForm do
begin
Color := clBlack;
Font.Color := clWhite;
Font.Style := [fsBold];
Font.Name := 'Courier New';
Font.Size := 9;
ClientWidth := ScaleX(690);
ClientHeight := ScaleY(459);
Caption := ExpandConstant('{#SetupSetting("AppName")}');
Center;

OuterNotebook.SetBounds(ScaleX(223), ScaleY(60), ScaleX(467), ScaleY(351));
InnerNotebook.SetBounds(UninstallProgressForm.InnerNotebook.Left - ScaleX(25), ScaleY(50), ScaleX(460), ScaleY(260));
InnerPage.Color := clBlack;
Bevel.SetBounds(ScaleX(0), ScaleY(410), ScaleX(690), ScaleY(2));
StatusLabel.Top := ScaleY(0);
ProgressBar.SetBounds(UninstallProgressForm.StatusLabel.Left, ScaleY(50), ScaleX(417), ScaleY(30));
end;

with UninstallProgressForm.PageNameLabel do
begin
Height := ScaleY(20);
Font.Name := UninstallProgressForm.Font.Name;
Font.Size := 12;
Font.Color := UninstallProgressForm.Font.Color;
end;

with UninstallProgressForm.PageDescriptionLabel do
begin
Top := UninstallProgressForm.PageDescriptionLabel.Top + ScaleY(8);
Height := ScaleY(15);
Width := ScaleX(500);
end;

UninstallBitmapImage := TBitmapImage.Create(UninstallProgressForm);
with UninstallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage.bmp'));
Parent := UninstallProgressForm;
SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
end;

with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardSmallImage.bmp'));
Left := ScaleX(633);
end;

with UninstallProgressForm.Bevel1 do
begin
Parent := UninstallProgressForm;
SetBounds(ScaleX(0), ScaleY(58), ScaleX(690), ScaleY(2));
end;

with UninstallProgressForm.MainPanel do
begin
Parent := UninstallProgressForm;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(690), ScaleY(58));
end;

with UninstallProgressForm.CancelButton do
begin
Left := ScaleX(590);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;
end;

////////////////////// UninstallingPage //////////////////////

//************************************************ [Конец - Компоненты страниц] ***************************************************//

procedure ShowComponents(CurPageID: Integer);
begin
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
ModNameLabel.Hide;
WizardForm.WelcomeLabel1.Hide;
WizardForm.FinishedHeadingLabel.Hide;

case CurPageID of
wpWelcome:
begin
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
ModNameLabel.Show;
end;
wpFinished:
begin
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
ModNameLabel.Show;
WizardForm.NextButton.Left := ScaleX(590);
end;
end;
end;

function InitializeSetup: Boolean;
begin
ExtractTemporaryFile('isskin.dll');
ExtractTemporaryFile('Tiger.cjstyles');

LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result:=True;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
CreatePageComponents;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ShowComponents(CurPageID);
end;

procedure DeinitializeSetup;
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin;
end;

function InitializeUninstall: Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\Tiger.cjstyles'), ExpandConstant('{tmp}\Tiger.cjstyles'), False);
FileCopy(ExpandConstant('{app}\WizardImage.bmp'), ExpandConstant('{tmp}\WizardImage.bmp'), False);
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{tmp}\WizardSmallImage.bmp'), False);
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result:=True;
end;

procedure InitializeUninstallProgressForm;
begin
RedesignUninstallProgressForm;
end;

procedure DeinitializeUninstall;
begin
UnloadSkin;
end;

Сейчас так:

хотелось бы получить:

Nordek 24-01-2014 22:18 2295639

TAY50N,

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

[Code]
 var
 SystemPage: TWizardPage;
 ModNameLabel: TNewStaticText;
 MouseLabel, SiteLabel: TLabel;

 GamePathPanel, GameVersPanel, GameModPanel: TPanel;
 FindGamePath, FindGameVers, FindGameMod, ReqSatisfy: TNewStaticText;
 GamePathMemo, GameVersMemo, GameModMemo, GamePathFindMemo, GameVersFindMemo, GameModFindMemo: TPanel;
 RenameCheckBox: TNewCheckBox;

 //процедуры, для использования скина (Tiger.cjstyles)
 procedure LoadSkin(lpszPath: PAnsiChar; lpszIniFileName: PAnsiChar); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload';
 procedure UnloadSkin; external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload';
 function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

 //процедуры, которые выполняются при наведении на ссылку (левый нижний угол)
 procedure SiteLabelOnClick(Sender: TObject); var ErrorCode: Integer;
 begin
 ShellExec('open', 'http:\\defir.uniogame.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 := WizardForm.Font.Color;
 end;

 procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 begin
 SiteLabel.Font.Color := clRed;
 end;

 procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 begin
 SiteLabel.Font.Color := WizardForm.Font.Color;
 end;

 procedure RedesignWizardForm;
 begin
 with WizardForm do
 begin
 Color := clBlack;
 WelcomePage.Color := clBlack;
 FinishedPage.Color := clBlack;
 Font.Color := clWhite;
 Font.Style := [fsBold];
 Font.Size := 9;
 ClientWidth := ScaleX(690);
 ClientHeight := ScaleY(459);
 Caption := ExpandConstant('{#SetupSetting("AppName")}');
 Center;
 end;

 with WizardForm.OuterNotebook do
 begin
 SetBounds(ScaleX(223), ScaleY(60), ScaleX(467), ScaleY(350));
 end;

 with WizardForm.InnerNotebook do
 begin
 SetBounds(WizardForm.InnerNotebook.Left - ScaleX(25), ScaleY(50), ScaleX(420), ScaleY(260));
 end;

 with WizardForm.InnerPage do
 begin
 Color := clBlack;
 end;

 with WizardForm.Bevel do
 begin
 SetBounds(ScaleX(0), ScaleY(410), ScaleX(690), ScaleY(2));
 end;

 with WizardForm.Bevel1 do
 begin
 Parent := WizardForm;
 SetBounds(ScaleX(0), ScaleY(58), ScaleX(690), ScaleY(2));
 end;

 with WizardForm.MainPanel do
 begin
 Parent := WizardForm;
 SetBounds(ScaleX(0), ScaleY(0), ScaleX(690), ScaleY(58));
 end;

 with WizardForm.WizardSmallBitmapImage do
 begin
 Left := ScaleX(633);
 end;

 with WizardForm.CancelButton do
 begin
 Left := ScaleX(590);
 Top := ScaleY(425);
 Font.Name := 'Tahoma';
 Font.Size := 8;
 Font.Style := [];
 end;

 with WizardForm.NextButton do
 begin
 Left := ScaleX(500);
 Top := ScaleY(425);
 Font.Name := 'Tahoma';
 Font.Size := 8;
 Font.Style := [];
 end;

 with WizardForm.BackButton do
 begin
 Left := ScaleX(410);
 Top := ScaleY(425);
 Font.Name := 'Tahoma';
 Font.Size := 8;
 Font.Style := [];
 end;

 with WizardForm.ReadyMemo do
 begin
 SetBounds(ScaleX(0), ScaleY(30), ScaleX(417), ScaleY(220));
 end;

 ModNameLabel := TNewStaticText.Create(WizardForm);
 with ModNameLabel do
 begin
 Parent := WizardForm.MainPanel;
 Font.Size := 22;
 Font.Name := 'Courier New';
 Font.Style := [fsBold];
 Font.Color := clWindowText;
 SetBounds(ScaleX(50), ScaleY(15), ScaleX(200), ScaleY(50));
 Caption := ExpandConstant('{#SetupSetting("AppName")}');
 end;

 MouseLabel := TLabel.Create(WizardForm);
 with MouseLabel do
 begin
 Parent := WizardForm;
 Width := WizardForm.Width;
 Height := WizardForm.Height;
 Autosize := False;
 Transparent := True;
 OnMouseMove := @SiteLabelMouseMove2;
 end;

 SiteLabel := TLabel.Create(WizardForm);
 with SiteLabel do
 begin
 Caption := ExpandConstant('{#SetupSetting("AppPublisherURL")}');
 Parent := WizardForm;
 Left := ScaleX(15);
 Top := ScaleY(425);
 Font.Name := 'Courier New';
 Cursor := crHand;
 OnClick := @SiteLabelOnClick;
 OnMouseDown := @SiteLabelMouseDown;
 OnMouseUp := @SiteLabelMouseUp;
 OnMouseMove := @SiteLabelMouseMove;
 end;
 end;

 //************************************************ [Начало - Компоненты страниц] ***************************************************//

 ////////////////////// WelcomePage //////////////////////

 procedure CreatePageComponents;
 begin

 with WizardForm.WizardBitmapImage do
 begin
 Parent := WizardForm;
 SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
 end;

 with TLabel.Create(WizardForm) do
 begin
 Caption := WizardForm.WelcomeLabel1.Caption;
 Parent := WizardForm.WelcomePage;
 Alignment := taCenter;
 AutoSize := False;
 Wordwrap := True;
 Font.Name := 'Courier New';
 Font.Size := 14;
 Font.Style := [fsBold];
 Transparent := True;
 SetBounds(ScaleX(30), ScaleY(45), ScaleX(407), ScaleY(45));
 end;

 with WizardForm.WelcomeLabel2 do
 begin
 Font.Name := 'Courier New';
 SetBounds(ScaleX(30), ScaleY(140), ScaleX(407), ScaleY(239));
 end;

 ////////////////////// WelcomePage //////////////////////

 with WizardForm.PageNameLabel do
 begin
 Height := ScaleY(20);
 Font.Name := 'Courier New';
 Font.Size := 12;
 Font.Color := WizardForm.Font.Color;
 end;

 with WizardForm.PageDescriptionLabel do
 begin
 Top := WizardForm.PageDescriptionLabel.Top + ScaleY(8);
 Height := ScaleY(15);
 Width := ScaleX(500);
 Font.Name := 'Courier New';
 end;

 ////////////////////// SelectDirPage //////////////////////

 WizardForm.SelectDirLabel.Font.Name := 'Courier New';

 with WizardForm.SelectDirBrowseLabel do
 begin
 Height := ScaleY(30);
 Font.Name := 'Courier New';
 end;

 with WizardForm.DirEdit do
 begin
 Top := ScaleY(50);
 Font.Size := 8;
 Font.Name := 'Courier New';
 Parent := WizardForm.SelectComponentsPage;
 end;

 with WizardForm.DirBrowseButton do
 begin
 Top := ScaleY(49);
 Font.Name := 'Tahoma';
 Font.Size := 8;
 Font.Style := [];
 Parent := WizardForm.SelectComponentsPage;
 end;

 with WizardForm.DiskSpaceLabel do
 begin
 Top := ScaleY(245);
 Font.Name := 'Courier New';
 end;

 ////////////////////// SelectDirPage //////////////////////

 ////////////////////// SelectComponentsPage //////////////////////

 with WizardForm.SelectComponentsLabel do
 begin
 Height := ScaleY(30);
 Font.Name := 'Courier New';
 end;

 with WizardForm.TypesCombo do
 begin
 Top := ScaleY(45);
 Font.Name := 'Courier New';
 end;

 with WizardForm.ComponentsList do
 begin
 Top := ScaleY(80);
 Height := ScaleY(155);
 Font.Name := 'Tahoma';
 Font.Size := 8;
 Font.Style := [];
 end;

 with WizardForm.ComponentsDiskSpaceLabel do
 begin
 Top := ScaleY(245);
 Font.Name := 'Courier New';
 end;

 ////////////////////// SelectComponentsPage //////////////////////

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

 with WizardForm.SelectStartMenuFolderLabel do
 begin
 Font.Name := 'Courier New';
 end;

 with WizardForm.SelectStartMenuFolderBrowseLabel do
 begin
 Height := ScaleY(30);
 Font.Name := 'Courier New';
 end;

 with WizardForm.GroupEdit do
 begin
 Top := ScaleY(100);
 Font.Name := 'Courier New';
 Font.Size := 8;
 end;

 with WizardForm.GroupBrowseButton do
 begin
 Top := ScaleY(99);
 Font.Name := 'Tahoma';
 Font.Size := 8;
 Font.Style := [];
 end;

 with WizardForm.NoIconsCheck do
 begin
 Top := ScaleY(245);
 Font.Name := 'Courier New';
 Width := ScaleX(250);
 end;

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

 ////////////////////// ReadyPage //////////////////////

 WizardForm.ReadyLabel.Font.Name := 'Courier New';
 WizardForm.ReadyMemo.Font.Name := 'Courier New';

 ////////////////////// ReadyPage //////////////////////

 ////////////////////// InstallingPage //////////////////////

 WizardForm.StatusLabel.Font.Name := 'Courier New';
 WizardForm.ProgressGauge.SetBounds(ScaleX(0), ScaleY(60), ScaleX(417), ScaleY(30));

 with WizardForm.FilenameLabel do
 begin
 Top := ScaleY(20);
 Font.Name := 'Courier New';
 Font.Style := [];
 end;

 ////////////////////// InstallingPage //////////////////////

 ////////////////////// FinishedPage //////////////////////

 with WizardForm.WizardBitmapImage2 do
 begin
 Parent := WizardForm;
 SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
 end;

 with TLabel.Create(WizardForm) do
 begin
 Caption := WizardForm.FinishedHeadingLabel.Caption;
 Parent := WizardForm.FinishedPage;
 Alignment := taCenter;
 AutoSize := False;
 Wordwrap := True;
 Font.Name := 'Courier New';
 Font.Size := 14;
 Font.Style := [fsBold];
 Transparent := True;
 SetBounds(ScaleX(30), ScaleY(45), ScaleX(407), ScaleY(45));
 end;

 with WizardForm.FinishedLabel do
 begin
 Font.Name := 'Courier New';
 SetBounds(ScaleX(30), ScaleY(130), ScaleX(407), ScaleY(239));
 end;
 end;

 ////////////////////// FinishedPage //////////////////////

 ////////////////////// UninstallingPage //////////////////////

 procedure RedesignUninstallProgressForm;
 var
 UninstallBitmapImage: TBitmapImage;
 begin
 with UninstallProgressForm do
 begin
 Color := clBlack;
 Font.Color := clWhite;
 Font.Style := [fsBold];
 Font.Name := 'Courier New';
 Font.Size := 9;
 ClientWidth := ScaleX(690);
 ClientHeight := ScaleY(459);
 Caption := ExpandConstant('{#SetupSetting("AppName")}');
 Center;

 OuterNotebook.SetBounds(ScaleX(223), ScaleY(60), ScaleX(467), ScaleY(351));
 InnerNotebook.SetBounds(UninstallProgressForm.InnerNotebook.Left - ScaleX(25), ScaleY(50), ScaleX(460), ScaleY(260));
 InnerPage.Color := clBlack;
 Bevel.SetBounds(ScaleX(0), ScaleY(410), ScaleX(690), ScaleY(2));
 StatusLabel.Top := ScaleY(0);
 ProgressBar.SetBounds(UninstallProgressForm.StatusLabel.Left, ScaleY(50), ScaleX(417), ScaleY(30));
 end;

 with UninstallProgressForm.PageNameLabel do
 begin
 Height := ScaleY(20);
 Font.Name := UninstallProgressForm.Font.Name;
 Font.Size := 12;
 Font.Color := UninstallProgressForm.Font.Color;
 end;

 with UninstallProgressForm.PageDescriptionLabel do
 begin
 Top := UninstallProgressForm.PageDescriptionLabel.Top + ScaleY(8);
 Height := ScaleY(15);
 Width := ScaleX(500);
 end;

 UninstallBitmapImage := TBitmapImage.Create(UninstallProgressForm);
 with UninstallBitmapImage do
 begin
 Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage.bmp'));
 Parent := UninstallProgressForm;
 SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
 end;

 with UninstallProgressForm.WizardSmallBitmapImage do
 begin
 Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardSmallImage.bmp'));
 Left := ScaleX(633);
 end;

 with UninstallProgressForm.Bevel1 do
 begin
 Parent := UninstallProgressForm;
 SetBounds(ScaleX(0), ScaleY(58), ScaleX(690), ScaleY(2));
 end;

 with UninstallProgressForm.MainPanel do
 begin
 Parent := UninstallProgressForm;
 SetBounds(ScaleX(0), ScaleY(0), ScaleX(690), ScaleY(58));
 end;

 with UninstallProgressForm.CancelButton do
 begin
 Left := ScaleX(590);
 Top := ScaleY(425);
 Font.Name := 'Tahoma';
 Font.Size := 8;
 Font.Style := [];
 end;
 end;

 ////////////////////// UninstallingPage //////////////////////

 //************************************************ [Конец - Компоненты страниц] ***************************************************//

 procedure ShowComponents(CurPageID: Integer);
 begin
 WizardForm.PageNameLabel.Show;
 WizardForm.PageDescriptionLabel.Show;
 ModNameLabel.Hide;
 WizardForm.WelcomeLabel1.Hide;
 WizardForm.FinishedHeadingLabel.Hide;

 case CurPageID of
 wpWelcome:
 begin
 WizardForm.PageNameLabel.Hide;
 WizardForm.PageDescriptionLabel.Hide;
 ModNameLabel.Show;
 end;
 wpFinished:
 begin
 WizardForm.PageNameLabel.Hide;
 WizardForm.PageDescriptionLabel.Hide;
 ModNameLabel.Show;
 WizardForm.NextButton.Left := ScaleX(590);
 end;
 end;
 end;

 function InitializeSetup: Boolean;
 begin
 ExtractTemporaryFile('isskin.dll');
 ExtractTemporaryFile('Tiger.cjstyles');

 LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
 Result:=True;
 end;

 procedure InitializeWizard();
 begin
 RedesignWizardForm;
 CreatePageComponents;
 end;

 procedure CurPageChanged(CurPageID: Integer);
 begin
 ShowComponents(CurPageID);
 end;

 procedure DeinitializeSetup;
 begin
 ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
 UnloadSkin;
 end;

 function InitializeUninstall: Boolean;
 begin
 FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), False);
 FileCopy(ExpandConstant('{app}\Tiger.cjstyles'), ExpandConstant('{tmp}\Tiger.cjstyles'), False);
 FileCopy(ExpandConstant('{app}\WizardImage.bmp'), ExpandConstant('{tmp}\WizardImage.bmp'), False);
 FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{tmp}\WizardSmallImage.bmp'), False);
 LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
 Result:=True;
 end;

 procedure InitializeUninstallProgressForm;
 begin
 RedesignUninstallProgressForm;
 end;

 procedure DeinitializeUninstall;
 begin
 UnloadSkin;
 end;


TAY50N 24-01-2014 23:17 2295673

Nordek, Спасибо! А как теперь скрыть страницу выбора папки установки?

Dinvin4ester 25-01-2014 00:58 2295734

Ребята ,помогите пожалуйста музыку вшить в инсталл - http://www.fayloobmennik.net/3517255

vint56 25-01-2014 00:58 2295735

TAY50N
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = 6) then
Result:= True;
end;

Nordek 25-01-2014 01:10 2295741

Цитата:

Цитата TAY50N
А как теперь скрыть страницу выбора папки установки? »

Самый простой способ в секцию [Setup] добавить DisableDirPage=true т.е:
Код:

[Setup]
AppName=TAY50N_mods
AppVersion=8.0
AppVerName=TAY50N_mods_8.0
DefaultDirName=C:\Games\World_of_Tanks
DefaultGroupName=TAY50N_mods
DirExistsWarning=no
AllowNoIcons=yes
AppPublisher=DEFIR
AppPublisherURL=defir.uniogame.com
AppCopyright=Copyright (C) TAY50N_mods
OutputBaseFilename=setup
WizardImageFile=InstallFiles\WizardImage.bmp
WizardSmallImageFile=InstallFiles\WizardSmallImage.bmp
SetupIconFile=InstallFiles\DEFIR.ico
DisableDirPage=true


TAY50N 25-01-2014 01:21 2295743

vint56, Nordek, Ура заработало! Спасибо! С этим разобрался!
Подскажите где почитать или как сделать описание (маленькими картинками) в окне "Выбор компонентов" к модам при наведении?

Nordek 25-01-2014 01:58 2295759

Цитата:

Цитата TAY50N
как сделать описание (маленькими картинками) в окне "Выбор компонентов" к модам при наведении? »

Ты не поверишь, но это самый популярный вопрос. Смотри сообщение #662.

TAY50N 25-01-2014 10:32 2295827

Большое Спасибо! :)
А есть пример где картинкам отведено определенное место? т.е. все описания будут отображаться в строго определенной области.

Ivan_009 25-01-2014 19:34 2296158

Цитата:

Цитата Dinvin4ester
Ребята ,помогите пожалуйста музыку вшить в инсталл - http://www.fayloobmennik.net/3517255 »

Чет инсталл 200 метров весит мега инсталл какой то...

Покажи код только...

Farser21 25-01-2014 20:39 2296192

Всем привет. Недавно переустановил ОС и после установил расширенную версию Inno Setup когда компилирую установщик появляются вот такие ошибки.

Из-за чего они могут появляться, и можно это как-то устранить?

Ivan_009 25-01-2014 20:43 2296196

Как наложить чекбокс через ботву и задать функцию, чтобы при выборе устанавливался дополнительный софт через секцию [code]... Покажите пример пожалуйста...

Цитата:

Цитата Farser21
Всем привет. Недавно переустановил ОС и после установил расширенную версию Inno Setup когда компилирую установщик появляются вот такие ошибки. »

Скрипт покажи телепаты в отпуске...

Nordek 25-01-2014 20:47 2296199

Цитата:

Цитата TAY50N
все описания будут отображаться в строго определенной области. »

В ShowPicHint
Замени
Код:

SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
на
Код:

SetBounds(ScaleX(700), ScaleY(410), InfoPic.Width, InfoPic.Height);

Farser21 25-01-2014 20:52 2296203

Ivan_009, http://rghost.ru/51921076

Dinvin4ester 25-01-2014 20:59 2296206

Ivan_009,
http://www.fayloobmennik.net/3519701

Ivan_009 25-01-2014 21:12 2296212

Farser21, Не знаю что у тебя но у меня все тип топ. Навсякий случай скачай и замени модуль BASS...

Dinvin4ester,Скачай тоже примеры использования внутри.

Ссылка: http://rghost.ru/51921479

vint56 25-01-2014 21:23 2296221

Dinvin4ester
http://rghost.ru/51921808

Dinvin4ester 25-01-2014 21:37 2296233

vint56, Ivan_009,
Спс.

Farser21 25-01-2014 22:26 2296261

Ivan_009, спасибо помогло!

Возникли еще вопросы, надеюсь поможете.
1)Как сделать так, чтобы когда устанавливаешь компоненты, можно было поставить флажок на удаление старых компонентов в определенной папке.
2)Как сделать авто определение установки, т.е. установщик сам выбирает нужную папку куда устанавливать.
Заранее спасибо за ответы!

TAY50N 26-01-2014 00:15 2296330

Цитата:

Цитата Nordek
Код:
SetBounds(ScaleX(700), ScaleY(410), InfoPic.Width, InfoPic.Height); »

я имел ввиду в строго определенной области установщика, а не экрана - сорри
т.е. когда наводится указатель на какой либо мод - картинка мода, отображается вместо WizardImageFile
Как это осуществить? Заранее Спасибо!

saurn 26-01-2014 02:32 2296393

Цитата:

Цитата Farser21
1)Как сделать так, чтобы когда устанавливаешь компоненты, можно было поставить флажок на удаление старых компонентов в определенной папке. »

Пост #271
Цитата:

Цитата Farser21
2)Как сделать авто определение установки, т.е. установщик сам выбирает нужную папку куда устанавливать. »

Уточните по какому критерию должен выполнятся выбор: на основе записи в реестре или непосредственный поиск папки по указанному имени.
------------------------------------------------------------------
Читайте форум. Эти вопросы давно уже заезжены-переезжены.
------------------------------------------------------------------

Цитата:

Цитата TAY50N
я имел ввиду в строго определенной области установщика, а не экрана - сорри »

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

[code]
const
   
UNDEF_INDEX = -777;
   
   
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';


var
   
InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
   
   
procedure ShowPicHint(const PicFilePath: String);
var
   
pt: TPoint;
begin
    if not
GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    InfoPic.SetBounds(ScaleX(245), ScaleY(42), ScaleX(166), ScaleY(165));
    InfoPic.Show;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
   
UndefPic: String;
begin
    if
Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case
TNewCheckListBox(Sender).ItemCaption[Index] of
           
'Half-Life 2': UndefPic := 'Wasteland_Scanner_con.bmp';
            'Half-Life 2 Episode One': UndefPic := 'Strider_early2.bmp';
            'Half-Life 2 Episode Two': UndefPic := 'Cremator_poster.bmp';
            'Portal': UndefPic := 'Portal.bmp';
        else
            begin
               
LastIndex := UNDEF_INDEX;
                InfoPic.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
       
LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
   
InfoPic.Hide;
    LastIndex := -1;
end;


procedure InitInfo();
begin
   
WizardForm.TypesCombo.Hide;
    WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(37), ScaleX(225), ScaleY(176));
    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
   
    with TBevel.Create(WizardForm) do
    begin
     
Parent := WizardForm.SelectComponentsPage;
      SetBounds(ScaleX(240), ScaleY(37), ScaleX(177), ScaleY(176));
      Shape := bsFrame;
    end;
   
    InfoPic := TBitmapImage.Create(WizardForm)
    with InfoPic do
    begin
       
Parent := WizardForm.SelectComponentsPage;
        AutoSize := True;
    end;
end;


procedure InitializeWizard();
begin
   
InitInfo();
end;


TAY50N 26-01-2014 12:17 2296485

Цитата:

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

Спасибо, Получилось!


И еще одно - как сделать чтобы было 0,0

скрипт:
читать дальше »
[Components]
Name: a; Description: Удаляем видео заставку;
Name: b; Description: "Часы в Ангаре";
Name: c; Description: "Выберите Прицел";
Name: c\1; Description: от zayaz; Flags: exclusive;
Name: c\2; Description: от ZCH_0933; Flags: exclusive;
Name: c\3; Description: от dab97; Flags: exclusive;
Name: c\4; Description: Бирюза; Flags: exclusive;
Name: c\5; Description: Анимированый; Flags: exclusive;
;Name: d; Description: "УГН";
;Name: e; Description: "ZoomMod + ZoomX";
;Name: q; Description: "Стандартные Звуки (папка Audio)";
;Name: f; Description: "Зоны пробития";
;Name: g; Description: "Белые трупы танков";
;Name: h; Description: "Уведомление союзников о засвете";
;Name: i; Description: "Прозрачный чат";
;Name: j; Description: "Дамаг Индикатор";
;Name: k; Description: Выберите Ангар;
;Name: k\1; Description: "«8 ноября»"; Flags: exclusive;
;Name: k\2; Description: "«Мастерская WG»"; Flags: exclusive;
;Name: l; Description: "Иконки";
;Name: m; Description: "Информативная панель";
;Name: o; Description: "Меню рамашка от TRJ-VoRoN";
;Name: p; Description: "Понель повреждений";
;Name: r; Description: "Статистика за сессию";
;Name: s; Description: "Список грядущих боёв на ГК";
;Name: t; Description: "Танки в два ряда";
;Name: y; Description: "XVM (Олень)";
;Name: u; Description: "Фокус";
;Name: w; Description: "Отображение оверлея (TS_Mumble_RaidCall)";
;Name: x; Description: "Максимальное увеличение дальности видимости";
;Name: z; Description: "Звуковой мод Громовые орудия, версия 1.6";
;Name: n; Description: "Реалистичная озвучка экипажа";
;Name: b1; Description: "Убираем облака";

[Files]
;////////////////////////////////////////Описание\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Source: 1.bmp; Flags: dontcopy nocompression
Source: 2.bmp; Flags: dontcopy nocompression
Source: 3.bmp; Flags: dontcopy nocompression
Source: 4.bmp; Flags: dontcopy nocompression
Source: 5.bmp; Flags: dontcopy nocompression
Source: 6.bmp; Flags: dontcopy nocompression
Source: 7.bmp; Flags: dontcopy nocompression

;/////////////////////////////////////// MODS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\isskin.dll"; DestDir: "{app}"; Flags: dontcopy nocompression; Attribs: hidden system;
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\Tiger.cjstyles"; DestDir: "{app}"; Flags: dontcopy nocompression; Attribs: hidden system;
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\WizardImage.bmp"; DestDir: "{app}"; Flags: dontcopy nocompression; Attribs: hidden system;
Source: "C:\Users\TaucoH\Desktop\334\InstallFiles\WizardSmallImage.bmp"; DestDir: "{app}"; Flags: dontcopy nocompression; Attribs: hidden system;
Source: "C:\Games\World_of_Tanks\MODS\01. Удаляем видео заставку (INTRO)\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: a;
Source: "C:\Games\World_of_Tanks\MODS\02. Часы в Ангаре\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: b;
Source: "C:\Games\World_of_Tanks\MODS\03.1 Прицел zayaz\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\1;
Source: "C:\Games\World_of_Tanks\MODS\03.2 Прицел ZCH_0933\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\2;
Source: "C:\Games\World_of_Tanks\MODS\03.3 Прицел от dab97\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\3;
Source: "C:\Games\World_of_Tanks\MODS\03.4 Прицел Бирюза\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\4;
Source: "C:\Games\World_of_Tanks\MODS\03.5 Прицел анимированый\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: c\5;
;Source: "C:\Games\World_of_Tanks\MODS\04. УГН\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: d;
;Source: "C:\Games\World_of_Tanks\MODS\05. ZoomMod + ZoomX\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: e;
;Source: "C:\Games\World_of_Tanks\MODS\06. Звуки Стандартные (папка Audio)\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: q;
;Source: "C:\Games\World_of_Tanks\MODS\07. Зоны пробития\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: f;
;Source: "C:\Games\World_of_Tanks\MODS\08. Белые трупы танков\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: g;
;Source: "C:\Games\World_of_Tanks\MODS\09. Уведомление союзников о засвете\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: h;
;Source: "C:\Games\World_of_Tanks\MODS\10. Прозрачный чат\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: i;
;Source: "C:\Games\World_of_Tanks\MODS\11. Дамаг Индикатор\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: j;
;Source: "C:\Games\World_of_Tanks\MODS\12.1 Ангар «8 ноября»\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: k\1;
;Source: "C:\Games\World_of_Tanks\MODS\12.2 Ангар «Мастерская WG»\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: k\2;
;Source: "C:\Games\World_of_Tanks\MODS\13. Иконки\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: l;
;Source: "C:\Games\World_of_Tanks\MODS\14. Информативная панель\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: m;
;Source: "C:\Games\World_of_Tanks\MODS\16. Меню рамашка от TRJ-VoRoN\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: o;
;Source: "C:\Games\World_of_Tanks\MODS\17. Понель повреждений\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: p;
;Source: "C:\Games\World_of_Tanks\MODS\18. Статистика за сессию\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: r;
;Source: "C:\Games\World_of_Tanks\MODS\19. Список грядущих боёв на ГК\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: s;
;Source: "C:\Games\World_of_Tanks\MODS\20. Танки в два ряда\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: t;
;Source: "C:\Games\World_of_Tanks\MODS\21. XVM (Олень)\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: y;
;Source: "C:\Games\World_of_Tanks\MODS\22. Фокус\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: u;
;Source: "C:\Games\World_of_Tanks\MODS\23. Отображение оверлея (TS_Mumble_RaidCall)\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: w;
;Source: "C:\Games\World_of_Tanks\MODS\24. Максимальное увеличение дальности видимости\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: x;
;Source: "C:\Games\World_of_Tanks\MODS\25. Звуковой мод Громовые орудия, версия 1.6\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: z;
;Source: "C:\Games\World_of_Tanks\MODS\26. Реалистичная озвучка экипажа\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: n;
;Source: "C:\Games\World_of_Tanks\MODS\27. Убираем облака\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: b1;

[Registry]
Root: HKLM; Subkey: "Software\TAY50N_mods\Version"; ValueType: string; ValueName: "Version"; ValueData: "8.0"; Flags: uninsdeletekey

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

const
UNDEF_INDEX = -777;
ALPHA_BLEND_LEVEL = 255; // max=Byte=255

WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);


var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;


type
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';

//////Картинка описания//////////
procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
InfoPic.SetBounds(ScaleX(251), ScaleY(70), ScaleX(225), ScaleY(229));
InfoPic.Show;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Удаляем видео заставку': UndefPic := '1.bmp';
'Часы в Ангаре': UndefPic := '2.bmp';
'от zayaz': UndefPic := '3.bmp';
'от ZCH_0933': UndefPic := '4.bmp';
else
begin
LastIndex := UNDEF_INDEX;
InfoPic.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
InfoPic.Hide;
LastIndex := -1;
end;


procedure InitInfo();
begin
WizardForm.TypesCombo.Hide;
WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(63), ScaleX(240), ScaleY(240));
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;

with TBevel.Create(WizardForm) do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(245), ScaleY(63), ScaleX(235), ScaleY(240));
Shape := bsFrame;
end;

InfoPic := TBitmapImage.Create(WizardForm)
with InfoPic do
begin
Parent := WizardForm.SelectComponentsPage;
AutoSize := True;
end;
end;


var
SystemPage: TWizardPage;
ModNameLabel: TNewStaticText;
MouseLabel, SiteLabel: TLabel;

GamePathPanel, GameVersPanel, GameModPanel: TPanel;
FindGamePath, FindGameVers, FindGameMod, ReqSatisfy: TNewStaticText;
GamePathMemo, GameVersMemo, GameModMemo, GamePathFindMemo, GameVersFindMemo, GameModFindMemo: TPanel;
RenameCheckBox: TNewCheckBox;

//процедуры, для использования скина (Tiger.cjstyles)
procedure LoadSkin(lpszPath: PAnsiChar; lpszIniFileName: PAnsiChar); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload';
procedure UnloadSkin; external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

//процедуры, которые выполняются при наведении на ссылку (левый нижний угол)
procedure SiteLabelOnClick(Sender: TObject); var ErrorCode: Integer;
begin
ShellExec('open', 'http:\\defir.uniogame.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 := WizardForm.Font.Color;
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color := clRed;
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color := WizardForm.Font.Color;
end;

procedure RedesignWizardForm;
begin
with WizardForm do
begin
Color := clBlack;
WelcomePage.Color := clBlack;
FinishedPage.Color := clBlack;
Font.Color := clWhite;
Font.Style := [fsBold];
Font.Size := 9;
ClientWidth := ScaleX(690);
ClientHeight := ScaleY(459);
Caption := ExpandConstant('{#SetupSetting("AppName")}');
Center;
end;

with WizardForm.OuterNotebook do
begin
SetBounds(ScaleX(180), ScaleY(60), ScaleX(680), ScaleY(350));
end;

with WizardForm.InnerNotebook do
begin
SetBounds(WizardForm.InnerNotebook.Left - ScaleX(40), ScaleY(10), ScaleX(560), ScaleY(340));
end;

with WizardForm.InnerPage do
begin
Color := clBlack;
end;

with WizardForm.Bevel do
begin
SetBounds(ScaleX(0), ScaleY(410), ScaleX(690), ScaleY(2));
end;

with WizardForm.Bevel1 do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(58), ScaleX(690), ScaleY(2));
end;

with WizardForm.MainPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(690), ScaleY(58));
end;

with WizardForm.WizardSmallBitmapImage do
begin
Left := ScaleX(633);
end;

with WizardForm.CancelButton do
begin
Left := ScaleX(590);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.NextButton do
begin
Left := ScaleX(500);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.BackButton do
begin
Left := ScaleX(410);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.ReadyMemo do
begin
SetBounds(ScaleX(0), ScaleY(30), ScaleX(480), ScaleY(280));
end;

ModNameLabel := TNewStaticText.Create(WizardForm);
with ModNameLabel do
begin
Parent := WizardForm.MainPanel;
Font.Size := 22;
Font.Name := 'Courier New';
Font.Style := [fsBold];
Font.Color := clWindowText;
SetBounds(ScaleX(20), ScaleY(15), ScaleX(200), ScaleY(50));
Caption := ExpandConstant('{#SetupSetting("AppName")}');
end;

MouseLabel := TLabel.Create(WizardForm);
with MouseLabel do
begin
Parent := WizardForm;
Width := WizardForm.Width;
Height := WizardForm.Height;
Autosize := False;
Transparent := True;
OnMouseMove := @SiteLabelMouseMove2;
end;

SiteLabel := TLabel.Create(WizardForm);
with SiteLabel do
begin
Caption := ExpandConstant('{#SetupSetting("AppPublisherURL")}');
Parent := WizardForm;
Left := ScaleX(15);
Top := ScaleY(425);
Font.Name := 'Courier New';
Cursor := crHand;
OnClick := @SiteLabelOnClick;
OnMouseDown := @SiteLabelMouseDown;
OnMouseUp := @SiteLabelMouseUp;
OnMouseMove := @SiteLabelMouseMove;
end;
end;

//************************************************ [Начало - Компоненты страниц] ***************************************************//

////////////////////// WelcomePage //////////////////////

procedure CreatePageComponents;
begin

with WizardForm.WizardBitmapImage do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(60), ScaleX(407), ScaleY(350));
end;

with TLabel.Create(WizardForm) do
begin
Caption := WizardForm.WelcomeLabel1.Caption;
Parent := WizardForm.WelcomePage;
Alignment := taCenter;
AutoSize := False;
Wordwrap := True;
Font.Name := 'Courier New';
Font.Size := 14;
Font.Style := [fsBold];
Transparent := True;
SetBounds(ScaleX(30), ScaleY(45), ScaleX(407), ScaleY(45));
end;

with WizardForm.WelcomeLabel2 do
begin
Font.Name := 'Courier New';
SetBounds(ScaleX(30), ScaleY(140), ScaleX(407), ScaleY(239));
end;

////////////////////// WelcomePage //////////////////////

with WizardForm.PageNameLabel do
begin
Height := ScaleY(20);
Font.Name := 'Courier New';
Font.Size := 12;
Font.Color := WizardForm.Font.Color;
end;

with WizardForm.PageDescriptionLabel do
begin
Top := WizardForm.PageDescriptionLabel.Top + ScaleY(8);
Height := ScaleY(15);
Width := ScaleX(550);
Font.Name := 'Courier New';
end;

////////////////////// SelectDirPage //////////////////////

WizardForm.SelectDirLabel.Font.Name := 'Courier New';

with WizardForm.SelectDirBrowseLabel do
begin
Height := ScaleY(30);
Font.Name := 'Courier New';
end;

with WizardForm.DirEdit do
begin
Top := ScaleY(50);
Font.Size := 10;
Font.Name := 'Courier New';
Parent := WizardForm.SelectComponentsPage;
end;

with WizardForm.DirBrowseButton do
begin
Left := ScaleX(405);
Top := ScaleY(100);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
Parent := WizardForm.SelectComponentsPage;
end;

with WizardForm.DiskSpaceLabel do
begin
Top := ScaleY(245);
Font.Name := 'Courier New';
end;


////////////////////// SelectDirPage //////////////////////

////////////////////// SelectComponentsPage //////////////////////

with WizardForm.SelectComponentsLabel do
begin
Height := ScaleY(30);
Font.Name := 'Courier New';
end;

with WizardForm.DirEdit do
begin
SetBounds(ScaleX(0), ScaleY(35), ScaleX(400), ScaleY(50));
Font.Size := 10;
Font.Name := 'Courier New';
Parent := WizardForm.SelectComponentsPage;
end;

with WizardForm.DirBrowseButton do
begin
Top := ScaleY(36);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
Parent := WizardForm.SelectComponentsPage;
end;

with WizardForm.TypesCombo do
begin
Top := ScaleY(45);
Font.Name := 'Courier New';
end;

with WizardForm.ComponentsList do
begin
Top := ScaleY(80);
Height := ScaleY(155);
Font.Name := 'Tahoma';
Font.Size := 9;
Font.Style := [];
end;

with WizardForm.ComponentsDiskSpaceLabel do
begin
Top := ScaleY(315);
Font.Name := 'Courier New';
end;

////////////////////// SelectComponentsPage //////////////////////

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

with WizardForm.SelectStartMenuFolderLabel do
begin
Font.Name := 'Courier New';
end;

with WizardForm.SelectStartMenuFolderBrowseLabel do
begin
Height := ScaleY(30);
Font.Name := 'Courier New';
end;

with WizardForm.GroupEdit do
begin
Top := ScaleY(100);
Font.Name := 'Courier New';
Font.Size := 8;
end;

with WizardForm.GroupBrowseButton do
begin
Top := ScaleY(99);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;

with WizardForm.NoIconsCheck do
begin
Top := ScaleY(245);
Font.Name := 'Courier New';
Width := ScaleX(250);
end;

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

////////////////////// ReadyPage //////////////////////

WizardForm.ReadyLabel.Font.Name := 'Courier New';
WizardForm.ReadyMemo.Font.Name := 'Courier New';

////////////////////// ReadyPage //////////////////////

////////////////////// InstallingPage //////////////////////

WizardForm.StatusLabel.Font.Name := 'Courier New';
WizardForm.ProgressGauge.SetBounds(ScaleX(0), ScaleY(60), ScaleX(417), ScaleY(30));

with WizardForm.FilenameLabel do
begin
Top := ScaleY(20);
Font.Name := 'Courier New';
Font.Style := [];
end;

////////////////////// InstallingPage //////////////////////

////////////////////// FinishedPage //////////////////////

with WizardForm.WizardBitmapImage2 do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
end;

with TLabel.Create(WizardForm) do
begin
Caption := WizardForm.FinishedHeadingLabel.Caption;
Parent := WizardForm.FinishedPage;
Alignment := taCenter;
AutoSize := False;
Wordwrap := True;
Font.Name := 'Courier New';
Font.Size := 14;
Font.Style := [fsBold];
Transparent := True;
SetBounds(ScaleX(30), ScaleY(45), ScaleX(407), ScaleY(45));
end;

with WizardForm.FinishedLabel do
begin
Font.Name := 'Courier New';
SetBounds(ScaleX(30), ScaleY(130), ScaleX(407), ScaleY(239));
end;
end;

////////////////////// FinishedPage //////////////////////

////////////////////// UninstallingPage //////////////////////

procedure RedesignUninstallProgressForm;
var
UninstallBitmapImage: TBitmapImage;
begin
with UninstallProgressForm do
begin
Color := clBlack;
Font.Color := clWhite;
Font.Style := [fsBold];
Font.Name := 'Courier New';
Font.Size := 9;
ClientWidth := ScaleX(690);
ClientHeight := ScaleY(459);
Caption := ExpandConstant('{#SetupSetting("AppName")}');
Center;

OuterNotebook.SetBounds(ScaleX(223), ScaleY(60), ScaleX(467), ScaleY(351));
InnerNotebook.SetBounds(UninstallProgressForm.InnerNotebook.Left - ScaleX(25), ScaleY(50), ScaleX(460), ScaleY(260));
InnerPage.Color := clBlack;
Bevel.SetBounds(ScaleX(0), ScaleY(410), ScaleX(690), ScaleY(2));
StatusLabel.Top := ScaleY(0);
ProgressBar.SetBounds(UninstallProgressForm.StatusLabel.Left, ScaleY(50), ScaleX(417), ScaleY(30));
end;

with UninstallProgressForm.PageNameLabel do
begin
Height := ScaleY(20);
Font.Name := UninstallProgressForm.Font.Name;
Font.Size := 12;
Font.Color := UninstallProgressForm.Font.Color;
end;

with UninstallProgressForm.PageDescriptionLabel do
begin
Top := UninstallProgressForm.PageDescriptionLabel.Top + ScaleY(8);
Height := ScaleY(15);
Width := ScaleX(500);
end;

UninstallBitmapImage := TBitmapImage.Create(UninstallProgressForm);
with UninstallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage.bmp'));
Parent := UninstallProgressForm;
SetBounds(ScaleX(0), ScaleY(60), ScaleX(223), ScaleY(350));
end;

with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardSmallImage.bmp'));
Left := ScaleX(633);
end;

with UninstallProgressForm.Bevel1 do
begin
Parent := UninstallProgressForm;
SetBounds(ScaleX(0), ScaleY(58), ScaleX(690), ScaleY(2));
end;

with UninstallProgressForm.MainPanel do
begin
Parent := UninstallProgressForm;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(690), ScaleY(58));
end;

with UninstallProgressForm.CancelButton do
begin
Left := ScaleX(590);
Top := ScaleY(425);
Font.Name := 'Tahoma';
Font.Size := 8;
Font.Style := [];
end;
end;

////////////////////// UninstallingPage //////////////////////

//************************************************ [Конец - Компоненты страниц] ***************************************************//
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = 6) then
Result:= True;
end;

procedure ShowComponents(CurPageID: Integer);
begin
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
ModNameLabel.Hide;
WizardForm.WelcomeLabel1.Hide;
WizardForm.FinishedHeadingLabel.Hide;

case CurPageID of
wpWelcome:
begin
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
ModNameLabel.Show;
end;
wpFinished:
begin
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
ModNameLabel.Show;
WizardForm.NextButton.Left := ScaleX(590);
end;
end;
end;

function InitializeSetup: Boolean;
begin
ExtractTemporaryFile('isskin.dll');
ExtractTemporaryFile('Tiger.cjstyles');

LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result:=True;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
CreatePageComponents;
InitInfo();
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ShowComponents(CurPageID);
end;

procedure DeinitializeSetup;
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin;
end;

function InitializeUninstall: Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\Tiger.cjstyles'), ExpandConstant('{tmp}\Tiger.cjstyles'), False);
FileCopy(ExpandConstant('{app}\WizardImage.bmp'), ExpandConstant('{tmp}\WizardImage.bmp'), False);
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{tmp}\WizardSmallImage.bmp'), False);
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result:=True;
end;

procedure InitializeUninstallProgressForm;
begin
RedesignUninstallProgressForm;
end;

procedure DeinitializeUninstall;
begin
UnloadSkin;
end;

saurn 26-01-2014 12:44 2296503

Цитата:

Цитата TAY50N
И еще одно - как сделать чтобы было 0,0 »

Проще просто отключить вывод информации о размере компонентов.
Код:

[Setup]
ShowComponentSizes=no


Farser21 26-01-2014 13:48 2296547

saurn , спасибо за ответ.

Уточняю второй вопрос.
2)Как сделать авто определение установки, т.е. установщик сам выбирает нужную папку куда устанавливать

Смотри предположим мне нужно, чтобы компоненты устанавливались в игру World_of_Tanks, но у кого-то на компе допустим эта папка называется просто WOT.
Или допустим чтобы установщик находил папку в которой находиться файл WorldOfTanks.exe.

Если будет поиск по указанному имени например World of Tanks, то не факт, что у кого-то папка называется именно так. Тогда получается нужно через реестр, расскажите пожалуйста как это сделать!

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

saurn 26-01-2014 14:02 2296556

Цитата:

Цитата Farser21
Тогда получается нужно через реестр, расскажите пожалуйста как это сделать! »

Проще всего вот так:
Код:

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1,InstallLocation}

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1: полный путь к разделу реестра игры.
InstallLocation: строковый параметр, содержащий полный путь к папке с установленной игрой.

Farser21 26-01-2014 14:08 2296561

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

saurn 26-01-2014 14:10 2296563

Цитата:

Цитата Farser21
игра должна находиться на системном диске? И если я так сделаю то будет автопоиск данной игры независимо от название папки? »

Без разницы. Установщик игры создает запись в реестре, с указанием пути к папке приложения.

Farser21 26-01-2014 14:29 2296584

saurn , спасибо сейчас попробую. А если у человека другой путь к этой игре на компе? Установщик найдет её?

saurn 26-01-2014 14:38 2296589

Цитата:

Цитата Farser21
А если у человека другой путь к этой игре на компе? »

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

Farser21 26-01-2014 14:55 2296603

saurn,



Вот нашел игру в реестре, но выскакивает вот такая ошибка.

saurn 26-01-2014 14:58 2296607

Farser21, ищите ветку реестра игры в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Nordek 26-01-2014 14:59 2296608

Цитата:

Цитата Farser21
А если у человека другой путь к этой игре на компе? Установщик найдет её? »

При условии если это ни чей нибудь левый репак и зная точный ключ деинсталляции то найдёт.

Farser21, В случае если игра будет не найдена то можно добавить альтернативный путь:
Код:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1,InstallLocation|{pf}\Альтернативный путь}
Вспоминай ещё такой вариант, далее.

Farser21 26-01-2014 15:14 2296618

saurn , Искал не нашел, игра только здесь. HKEY_CURRENT_USER\Software\Wargaming.net\wot\Launcher


Что, я сделал не так? http://rghost.ru/51936562

Nordek 26-01-2014 15:25 2296626

Цитата:

Цитата Farser21
игра только здесь. HKEY_CURRENT_USER\Software\Wargaming.net\wot\Launcher »

В этой ветке реестра какие нибудь пути к игре есть? Поищи.

saurn 26-01-2014 15:28 2296628

Цитата:

Цитата Farser21
Что, я сделал не так? »

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

#include "BASS_Module.iss"

#define Pic1 "Зеленый"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Сборка модов к патчу 0.8.11 от Farser
AppVerName=Сборка модов к патчу 0.8.11 от Farser
AppVersion=0.8.11
DefaultDirName={code:GetPreviousDir}
DefaultGroupName=Сборка модов от Farser
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=Images\Внешний вид(Собери сам)\2.bmp
WizardSmallImageFile=Images\Внешний вид(Собери сам)\2-2.bmp
SetupIconFile=Images\Внешний вид(Собери сам)\back.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1
ComponentsListTVStyle=yes

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

[Run]
Filename: "{app}\WorldOfTanks.exe"; Description: "Запустить World Of Tanks после установки?";  Flags: postinstall shellexec;

[Components]
Name: g0; Description: Прицелы; Flags:  dontinheritcheck
Name: g0\c1; Description: Прицел Кирилла Орешкина; Flags: exclusive
Name: g0\c1\c2; Description: Зеленый; Flags: exclusive
Name: g0\c1\c3; Description: Синий; Flags: exclusive
Name: g0\c4; Description: Minimalistic Sights (Выбор PROТанки); Flags: exclusive
Name: g0\c5; Description: Прицел от AtotIK (Выбор Вспышки); Flags: exclusive
Name: g0\c6; Description: Прицел от J1mB0 (Выбор Муразора); Flags: exclusive
Name: g0\c7; Description: Прицел от zayaz (Выбор Джова); Flags: exclusive
Name: g0\c8; Description: Белый прицел; Flags: exclusive
Name: g0\c9; Description: Корейский прицел; Flags: exclusive
Name: g0\c10; Description: Прицел от Андрея Тареева; Flags: exclusive
Name: g0\c11; Description: Спайперский прицел ZX mini; Flags: exclusive
Name: g0\c12; Description: Снайперский прицел Warface; Flags: exclusive
Name: g0\c13; Description: Снайперский прицел TAIPAN; Flags: exclusive
Name: g0\c14; Description: Снайперский прицел (Простой); Flags: exclusive
Name: g0\c15; Description: Снайперский прицел (Бирюза); Flags: exclusive
Name: g0\c16; Description: Анимированный прицел (Снайперский); Flags: exclusive
Name: g0\c17; Description: Сведение с Пробитием снаряда и Толщиной брони; Flags: exclusive

Name: g1; Description: Серверный прицел (Новый); Flags:  dontinheritcheck

Name: g0; Description: Информативная панель; Flags:  dontinheritcheck
Name: g0\c18; Description: Информативная панель (Стандартная); Flags: exclusive
Name: g0\c19; Description: Информативная панель (Цветная); Flags: exclusive

Name: g2; Description: Убираем черноту в снайперском режиме; Flags:  dontinheritcheck

Name: g3; Description: ZoomX16 (Зум в прицеле); Flags:  dontinheritcheck

Name: g4; Description: Зум; Flags:  dontinheritcheck

Name: g0; Description: Арт-прицелы; Flags:  dontinheritcheck
Name: g0\c20; Description: Анимированный Арт-прицел; Flags: exclusive
Name: g0\c21; Description: Арт прицел (Бирюза); Flags: exclusive
Name: g0\c22; Description: Арт-прицел (Белый); Flags: exclusive
Name: g0\c23; Description: Арт-прицел (Дамоклов меч); Flags: exclusive
Name: g0\c24; Description: Арт-прицел (Простой); Flags: exclusive
Name: g0\c25; Description: Арт-прицел Minimalistic Sights; Flags: exclusive
Name: g0\c26; Description: Арт-прицел Sting RETRO; Flags: exclusive
Name: g0\c27; Description: Арт-прицел; Flags: exclusive
Name: g0\c28; Description: Информативный арт-прицел; Flags: exclusive
Name: g0\c29; Description: Необычный Арт-прицел; Flags: exclusive

Name: g0; Description: Ангары; Flags:  dontinheritcheck
Name: g0\c30; Description: Ангар к Хеллоуину от Wargaming; Flags: exclusive
Name: g0\c31; Description: Ангар от разработчиков; Flags: exclusive
Name: g0\c32; Description: Новогодний ангар от Wargaming; Flags: exclusive

Name: g0; Description: Панели повреждения; Flags:  dontinheritcheck
Name: g0\c33; Description: Анимированная Дамаг панель; Flags: exclusive
Name: g0\c34; Description: Дамаг панель (Прозрачная) с таймером починки; Flags: exclusive
Name: g0\c35; Description: Дамаг панель (Прозрачная); Flags: exclusive
Name: g0\c36; Description: Дамаг панель (С новыми иконками модулей); Flags: exclusive
Name: g0\c37; Description: Дамаг панель Xbox; Flags: exclusive
Name: g0\c38; Description: Дамаг панель Бионик (Зеленый); Flags: exclusive
Name: g0\c39; Description: Дамаг панель Бионик (Черный); Flags: exclusive
Name: g0\c40; Description: Дамаг панель в стиле RPG; Flags: exclusive
Name: g0\c41; Description: Дамаг панель от zayaz; Flags: exclusive
Name: g0\c42; Description: Зеленая дамаг панель; Flags: exclusive
Name: g0\c43; Description: Китайская дамаг панель; Flags: exclusive
Name: g0\c44; Description: Стандартная дамаг панель (С логом полученного урона); Flags: exclusive

Name: g0; Description: Дамаг индикаторы; Flags:  dontinheritcheck
Name: g0\c45; Description: Дамаг индикатор (Легкий); Flags: exclusive
Name: g0\c46; Description: Дамаг индикатор (Простой); Flags: exclusive
Name: g0\c47; Description: Дамаг индикатор (Пуля); Flags: exclusive
Name: g0\c48; Description: Дамаг индикатор Warface; Flags: exclusive
Name: g0\c49; Description: Дамаг индикатор; Flags: exclusive

Name: g0; Description: Маркеры фокуса; Flags:  dontinheritcheck
Name: g0\c50; Description: Маркер фокуса (Атакую) желтый; Flags: exclusive
Name: g0\c51; Description: Маркер фокуса (Атакую) зеленый; Flags: exclusive
Name: g0\c52; Description: Маркер фокуса (Атакую) красный; Flags: exclusive
Name: g0\c53; Description: Маркер фокуса (Атакую) синий; Flags: exclusive

Name: g0; Description: УГН (Углы Горизонтальной Наводки); Flags:  dontinheritcheck
Name: g0\c54; Description: УГН для ПТ (Желтые); Flags: exclusive
Name: g0\c55; Description: УГН для ПТ в стиле zayaz; Flags: exclusive
Name: g0\c56; Description: УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта; Flags: exclusive
Name: g0\c57; Description: УГН для ПТ и Арты (Квадратные); Flags: exclusive
Name: g0\c58; Description: УГН для ПТ и Арты (Оранжевые); Flags: exclusive
Name: g0\c59; Description: УГН для ПТ и Арты (Скобки); Flags: exclusive

Name: g0; Description: Часы; Flags:  dontinheritcheck
Name: g0\c60; Description: Часы в ангаре (С желтой подсветкой); Flags: exclusive
Name: g0\c61; Description: Часы в ангаре (С красной подсветкой); Flags: exclusive
Name: g0\c62; Description: Часы в бою; Flags: exclusive
Name: g0\c63; Description: Часы с датой в ангаре (Белые); Flags: exclusive
Name: g0\c64; Description: Часы с датой в бою (Желтые); Flags: exclusive
Name: g0\c65; Description: Часы с датой в бою; Flags: exclusive

Name: g0; Description: Мини-карты; Flags:  dontinheritcheck
Name: g0\c66; Description: Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков); Flags: exclusive
Name: g0\c67; Description: Рамка для мини карты в стиле zayaz; Flags: exclusive

Name: g0; Description: Карусель танков в ангаре; Flags:  dontinheritcheck
Name: g0\c68; Description: Танки в 2 ряда; Flags: exclusive
Name: g0\c69; Description: Танки в 3 ряда; Flags: exclusive

Name: g0; Description: Лампы шестого чувства; Flags:  dontinheritcheck
Name: g0\c70; Description: Лампа шестого чувства в стиле zayaz; Flags: exclusive

Name: g0; Description: Иконки; Flags:  dontinheritcheck
Name: g0\c71; Description: Иконки снарядов; Flags: dontinheritcheck

Name: g0; Description: Разное; Flags:  dontinheritcheck
Name: g0\c72; Description: Безопасная стрельба - отключение дружеского огня; Flags: dontinheritcheck
Name: g0\c73; Description: Дебуг панель; Flags: dontinheritcheck
Name: g0\c74; Description: Души танков в виде Оленя; Flags: dontinheritcheck
Name: g0\c75; Description: Души танков; Flags: dontinheritcheck
Name: g0\c76; Description: Замена китайских имен танкистов на русские; Flags: dontinheritcheck
Name: g0\c77; Description: Колесо загрузки (Краб); Flags: dontinheritcheck
Name: g0\c78; Description: Цветные пробития; Flags: dontinheritcheck

Name: g0; Description: Шкурки; Flags:  dontinheritcheck
Name: g0\c79; Description: Белые трупы уничтоженной техники; Flags: exclusive
Name: g0\c80; Description: Красные трупы уничтоженной техники; Flags: exclusive
Name: g0\c81; Description: Синие трупы уничтоженной техники; Flags: exclusive
Name: g0\c82; Description: Черные трупы уничтоженной техники; Flags: exclusive

[Files]
Source: BASS_Files\*;  DestDir: {tmp}; Flags: dontcopy
Source: C:\Users\Farser\Desktop\BASS_Files\music.mp3;  DestDir: {tmp}; Flags: dontcopy

Source: Images\Содержимое\{#Pic1}.bmp; Flags: dontcopy nocompression

[Icons]
Name: "{group}\{cm:UninstallProgram,World of Tanks}"; Filename: "{uninstallexe}"

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

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

const
   
UNDEF_INDEX      = -777;
    ALPHA_BLEND_LEVEL = 230; // max=Byte=255

   
WS_EX_LAYERED    = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY    = 1;
    LWA_ALPHA        = 2;
    GWL_EXSTYLE      = (-20);

    Color = clblack;


type
   
COLORREF = DWORD;
   
   
function GetCursorPos(var lpPoint: TPoint): BOOL;
    external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean;
    external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint;
    external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
    external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND;
    external 'SetFocus@user32.dll stdcall';


var
   
InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;
   
   
function GetPreviousDir(const Buff: String): String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Buff);  //ветка реестра World of Tanks
   
if Buff <> '' then Result := RemoveBackslash(Buff);
end;

function InitializeSetup(): Boolean;
var
   
Buff: String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'UninstallString', Buff);
    Result := FileExists(RemoveQuotes(Buff));
    if not Result then MsgBox('Игра не найдена!', mbError, mb_ok);
end;


procedure ShowPicHint(const PicFilePath: String);
var
   
pt: TPoint;
begin
    if not
GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with
PicForm do
        begin
//            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
           
Left := ScaleX(700);    // Слева
           
Top := ScaleY(545);    // Сверху
           
Width := ScaleX(280);  // Ширина
           
Height := ScaleY(215);  // Высота
           
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
       
SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
   
UndefPic: String;
begin
    if
Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case
TNewCheckListBox(Sender).ItemCaption[Index] of
           
'Зеленый': UndefPic := '{#Pic1}.bmp';
        else
            begin
               
LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
       
LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
   
PicForm.Hide;
end;


procedure InitInfo();
begin
   
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
       
BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
           
Parent := PicForm;
            AutoSize := True;
        end;
    end;
end;

procedure InitializeWizard();
var
   
i, iCount: Integer;
begin
   
InitInfo();
    WizardForm.TypesCombo.Visible := False;

    iCount := WizardForm.ComponentsList.Items.Count - 1;

    for i := iCount downto 0 do
     
WizardForm.ComponentsList.Checked[i]:= False;

    ExtractTemporaryFile('BASS.dll');
    ExtractTemporaryFile('CallbackCtrl.dll');
    ExtractTemporaryFile('botva2.dll');
    ExtractTemporaryFile('MusicButton.png');
    ExtractTemporaryFile('Music.mp3');

    BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
   
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 3, 465, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
   
BASS_DeInit; //Освобождаем процесс
   
gdipShutdown
end;


Farser21 26-01-2014 16:00 2296653

saurn и Nordek, спасибо за вашу помощь. Теперь все находит.

Как убрать это окошко?

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

saurn 26-01-2014 16:13 2296664

Цитата:

Цитата Farser21
Как убрать это окошко? »

http://forum.oszone.net/post-2292921-1915.html

innot20 26-01-2014 16:24 2296677

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

Farser21 26-01-2014 16:32 2296683

saurn, Спасибо

Farser21 26-01-2014 16:56 2296702

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

Возможно вывести сюда галочку на удаление компонентов?


Nordek 26-01-2014 17:00 2296705

Цитата:

Цитата innot20
как сделать автозапоминание компонентов при следующей установке »

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

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

Цитата Справка Inno Setup: Параметры командной строки инсталлятора
/SAVEINF="filename"
Указывает инсталлятору сохранять параметры установки в указанный файл.
Не забудьте ставить кавычки при использовании имен, содержащих пробелы.

Например сохранение настроек в файл setup.ini:
Код:

Твой_инсталлятор.exe /SAVEINF="setup.ini"
Цитата:

Цитата Справка Inno Setup: Параметры командной строки инсталлятора
/LOADINF="filename"
Указывает инсталлятору загрузить параметры установки из указанного файла после проверки командной строки. Этот файл может быть подготовлен с помощью /LOADINF="command".

Например загрузка ранее сохранённых настроек из файла setup.ini:
Код:

Твой_инсталлятор.exe /LOADINF="setup.ini"

innot20 26-01-2014 17:14 2296713

при установке поверх установки из того же инсталлятора
галочки всё равно не запоминаются

saurn 26-01-2014 18:07 2296754

Цитата:

Цитата Farser21
Возможно вывести сюда галочку на удаление компонентов? »

Для начала надо знать какие компоненты удалять. Или просто грохнуть все, что есть в папке?

Цитата:

Цитата innot20
Здравствуйте, подскажите как сделать автозапоминание компонентов при следующей установке »

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

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


[Components]
Name: program1; Description: Компонент 1; Types: full
Name: program2; Description: Компонент 2; Types: full
Name: program3; Description: Компонент 3; Types: full


[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: program1;
Source: compiler:Examples\MyProg-x64.exe; DestDir: {app}; Components: program2;
Source: compiler:Examples\MyProg-IA64.exe; DestDir: {app}; Components: program3;


[Code]
procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
   
SetPreviousData(PreviousDataKey, 'Компонент 1', IntToStr(Ord(WizardForm.ComponentsList.Checked[0])));
    SetPreviousData(PreviousDataKey, 'Компонент 2', IntToStr(Ord(WizardForm.ComponentsList.Checked[1])));
    SetPreviousData(PreviousDataKey, 'Компонент 3', IntToStr(Ord(WizardForm.ComponentsList.Checked[2])));
end;

procedure InitializeWizard();
begin
   
WizardForm.ComponentsList.Checked[0] := GetPreviousData('Компонент 1', '1') = '1';
    WizardForm.ComponentsList.Checked[1] := GetPreviousData('Компонент 2', '1') = '1';
    WizardForm.ComponentsList.Checked[2] := GetPreviousData('Компонент 3', '1') = '1';
end;


Farser21 26-01-2014 18:54 2296804

saurn,ну вот у меня есть папка res_mods, чтобы удалить все содержимое этой папки

1specific 26-01-2014 19:08 2296818

Добрые люди, скажите пожалуйста, как в inno setup сделать так, чтоб человек выбирал свою операционную систему, и в соответствии с его выбором в установленную директорию копировался файл1 или файл2.
При этом нужно сделать так, чтоб человек не упустил этот пункт выбора ОС, т.к. от этого в итоге зависит работоспособность приложения.

Я пробовал добавлять в установщик пункты radio button, но там проблема в том, что по дефолту один уже выбран, а сделать так, чтоб небыло выбрано ничего нельзя (unchecked работает только на 1 пункт)
Пробовал модифицировать диалог выбора языка на диалог выбора windows, но проблема почти такая же что и с radio buttons - изначально уже выбрано что-то, а переделать его графически не представляется возможным.
В общем нужно чтоб человек сам выбрал свою версию ОС, и его не пускало дальше, если он не сделал выбор.
Спасибо! ))

Nordek 26-01-2014 19:24 2296826

Цитата:

Цитата 1specific
как в inno setup сделать так, чтоб человек выбирал свою операционную систему »

Inno может автоматически определять операционную систему, используй MinVersion

Код:

[Files]
Source: MyProg1.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 0,5.01
Source: MyProg2.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 0,6.0


1specific 26-01-2014 19:49 2296848

Nordek,
Большое спасибо, однако в дальнейшем планирую не только выбор ОС предлагать пользователю, но и выбор языка приложения, поэтому лучше наврено чтоб он сам выбрал.
ВО вторых я не сильно доверяю автоматическому определению )) Например когда выйдет 8.2, а в установщике он не прописан, что будет в таком случае делать установщик?

И скажите еще пожалуйста, как здесь указать несколько версий виндус? MinVersion: 0,5.01
Через пробел не получается :)
И нужно ли для сервис паков (sp1, sp2) указывать тоже, или достаточно просто указать для XP, и туда войдут все SP?

Или MinVersion можно перевести буквально - минимальная версия виндус? И если я указжу в первый ХР, а во второй 8, то в первом будет все от ХР до 7 включительно, а в 8 от 8 и дальше включительно?

saurn 26-01-2014 20:15 2296858

Цитата:

Цитата Farser21
ну вот у меня есть папка res_mods, чтобы удалить все содержимое этой папки »

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

#include "BASS_Module.iss"

#define Pic1 "Зеленый"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Сборка модов к патчу 0.8.11 от Farser
AppVerName=Сборка модов к патчу 0.8.11 от Farser
AppVersion=0.8.11
DefaultDirName={code:GetPreviousDir}
DefaultGroupName=Сборка модов от Farser
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=Images\Внешний вид(Собери сам)\2.bmp
WizardSmallImageFile=Images\Внешний вид(Собери сам)\2-2.bmp
SetupIconFile=Images\Внешний вид(Собери сам)\back.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1
ComponentsListTVStyle=yes

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

[Run]
Filename: "{app}\WorldOfTanks.exe"; Description: "Запустить World Of Tanks после установки?";  Flags: postinstall shellexec;

[Components]
Name: g0; Description: Прицелы; Flags:  dontinheritcheck
Name: g0\c1; Description: Прицел Кирилла Орешкина; Flags: exclusive
Name: g0\c1\c2; Description: Зеленый; Flags: exclusive
Name: g0\c1\c3; Description: Синий; Flags: exclusive
Name: g0\c4; Description: Minimalistic Sights (Выбор PROТанки); Flags: exclusive
Name: g0\c5; Description: Прицел от AtotIK (Выбор Вспышки); Flags: exclusive
Name: g0\c6; Description: Прицел от J1mB0 (Выбор Муразора); Flags: exclusive
Name: g0\c7; Description: Прицел от zayaz (Выбор Джова); Flags: exclusive
Name: g0\c8; Description: Белый прицел; Flags: exclusive
Name: g0\c9; Description: Корейский прицел; Flags: exclusive
Name: g0\c10; Description: Прицел от Андрея Тареева; Flags: exclusive
Name: g0\c11; Description: Спайперский прицел ZX mini; Flags: exclusive
Name: g0\c12; Description: Снайперский прицел Warface; Flags: exclusive
Name: g0\c13; Description: Снайперский прицел TAIPAN; Flags: exclusive
Name: g0\c14; Description: Снайперский прицел (Простой); Flags: exclusive
Name: g0\c15; Description: Снайперский прицел (Бирюза); Flags: exclusive
Name: g0\c16; Description: Анимированный прицел (Снайперский); Flags: exclusive
Name: g0\c17; Description: Сведение с Пробитием снаряда и Толщиной брони; Flags: exclusive

Name: g1; Description: Серверный прицел (Новый); Flags:  dontinheritcheck

Name: g0; Description: Информативная панель; Flags:  dontinheritcheck
Name: g0\c18; Description: Информативная панель (Стандартная); Flags: exclusive
Name: g0\c19; Description: Информативная панель (Цветная); Flags: exclusive

Name: g2; Description: Убираем черноту в снайперском режиме; Flags:  dontinheritcheck

Name: g3; Description: ZoomX16 (Зум в прицеле); Flags:  dontinheritcheck

Name: g4; Description: Зум; Flags:  dontinheritcheck

Name: g0; Description: Арт-прицелы; Flags:  dontinheritcheck
Name: g0\c20; Description: Анимированный Арт-прицел; Flags: exclusive
Name: g0\c21; Description: Арт прицел (Бирюза); Flags: exclusive
Name: g0\c22; Description: Арт-прицел (Белый); Flags: exclusive
Name: g0\c23; Description: Арт-прицел (Дамоклов меч); Flags: exclusive
Name: g0\c24; Description: Арт-прицел (Простой); Flags: exclusive
Name: g0\c25; Description: Арт-прицел Minimalistic Sights; Flags: exclusive
Name: g0\c26; Description: Арт-прицел Sting RETRO; Flags: exclusive
Name: g0\c27; Description: Арт-прицел; Flags: exclusive
Name: g0\c28; Description: Информативный арт-прицел; Flags: exclusive
Name: g0\c29; Description: Необычный Арт-прицел; Flags: exclusive

Name: g0; Description: Ангары; Flags:  dontinheritcheck
Name: g0\c30; Description: Ангар к Хеллоуину от Wargaming; Flags: exclusive
Name: g0\c31; Description: Ангар от разработчиков; Flags: exclusive
Name: g0\c32; Description: Новогодний ангар от Wargaming; Flags: exclusive

Name: g0; Description: Панели повреждения; Flags:  dontinheritcheck
Name: g0\c33; Description: Анимированная Дамаг панель; Flags: exclusive
Name: g0\c34; Description: Дамаг панель (Прозрачная) с таймером починки; Flags: exclusive
Name: g0\c35; Description: Дамаг панель (Прозрачная); Flags: exclusive
Name: g0\c36; Description: Дамаг панель (С новыми иконками модулей); Flags: exclusive
Name: g0\c37; Description: Дамаг панель Xbox; Flags: exclusive
Name: g0\c38; Description: Дамаг панель Бионик (Зеленый); Flags: exclusive
Name: g0\c39; Description: Дамаг панель Бионик (Черный); Flags: exclusive
Name: g0\c40; Description: Дамаг панель в стиле RPG; Flags: exclusive
Name: g0\c41; Description: Дамаг панель от zayaz; Flags: exclusive
Name: g0\c42; Description: Зеленая дамаг панель; Flags: exclusive
Name: g0\c43; Description: Китайская дамаг панель; Flags: exclusive
Name: g0\c44; Description: Стандартная дамаг панель (С логом полученного урона); Flags: exclusive

Name: g0; Description: Дамаг индикаторы; Flags:  dontinheritcheck
Name: g0\c45; Description: Дамаг индикатор (Легкий); Flags: exclusive
Name: g0\c46; Description: Дамаг индикатор (Простой); Flags: exclusive
Name: g0\c47; Description: Дамаг индикатор (Пуля); Flags: exclusive
Name: g0\c48; Description: Дамаг индикатор Warface; Flags: exclusive
Name: g0\c49; Description: Дамаг индикатор; Flags: exclusive

Name: g0; Description: Маркеры фокуса; Flags:  dontinheritcheck
Name: g0\c50; Description: Маркер фокуса (Атакую) желтый; Flags: exclusive
Name: g0\c51; Description: Маркер фокуса (Атакую) зеленый; Flags: exclusive
Name: g0\c52; Description: Маркер фокуса (Атакую) красный; Flags: exclusive
Name: g0\c53; Description: Маркер фокуса (Атакую) синий; Flags: exclusive

Name: g0; Description: УГН (Углы Горизонтальной Наводки); Flags:  dontinheritcheck
Name: g0\c54; Description: УГН для ПТ (Желтые); Flags: exclusive
Name: g0\c55; Description: УГН для ПТ в стиле zayaz; Flags: exclusive
Name: g0\c56; Description: УГН для ПТ и Арты (MeltyMap) + Улучшеная мини-карта; Flags: exclusive
Name: g0\c57; Description: УГН для ПТ и Арты (Квадратные); Flags: exclusive
Name: g0\c58; Description: УГН для ПТ и Арты (Оранжевые); Flags: exclusive
Name: g0\c59; Description: УГН для ПТ и Арты (Скобки); Flags: exclusive

Name: g0; Description: Часы; Flags:  dontinheritcheck
Name: g0\c60; Description: Часы в ангаре (С желтой подсветкой); Flags: exclusive
Name: g0\c61; Description: Часы в ангаре (С красной подсветкой); Flags: exclusive
Name: g0\c62; Description: Часы в бою; Flags: exclusive
Name: g0\c63; Description: Часы с датой в ангаре (Белые); Flags: exclusive
Name: g0\c64; Description: Часы с датой в бою (Желтые); Flags: exclusive
Name: g0\c65; Description: Часы с датой в бою; Flags: exclusive

Name: g0; Description: Мини-карты; Flags:  dontinheritcheck
Name: g0\c66; Description: Мини карта (Названия танков, луч, сонар, радиус обзора, ники игроков); Flags: exclusive
Name: g0\c67; Description: Рамка для мини карты в стиле zayaz; Flags: exclusive

Name: g0; Description: Карусель танков в ангаре; Flags:  dontinheritcheck
Name: g0\c68; Description: Танки в 2 ряда; Flags: exclusive
Name: g0\c69; Description: Танки в 3 ряда; Flags: exclusive

Name: g0; Description: Лампы шестого чувства; Flags:  dontinheritcheck
Name: g0\c70; Description: Лампа шестого чувства в стиле zayaz; Flags: exclusive

Name: g0; Description: Иконки; Flags:  dontinheritcheck
Name: g0\c71; Description: Иконки снарядов; Flags: dontinheritcheck

Name: g0; Description: Разное; Flags:  dontinheritcheck
Name: g0\c72; Description: Безопасная стрельба - отключение дружеского огня; Flags: dontinheritcheck
Name: g0\c73; Description: Дебуг панель; Flags: dontinheritcheck
Name: g0\c74; Description: Души танков в виде Оленя; Flags: dontinheritcheck
Name: g0\c75; Description: Души танков; Flags: dontinheritcheck
Name: g0\c76; Description: Замена китайских имен танкистов на русские; Flags: dontinheritcheck
Name: g0\c77; Description: Колесо загрузки (Краб); Flags: dontinheritcheck
Name: g0\c78; Description: Цветные пробития; Flags: dontinheritcheck

Name: g0; Description: Шкурки; Flags:  dontinheritcheck
Name: g0\c79; Description: Белые трупы уничтоженной техники; Flags: exclusive
Name: g0\c80; Description: Красные трупы уничтоженной техники; Flags: exclusive
Name: g0\c81; Description: Синие трупы уничтоженной техники; Flags: exclusive
Name: g0\c82; Description: Черные трупы уничтоженной техники; Flags: exclusive

[Files]
Source: BASS_Files\*;  DestDir: {tmp}; Flags: dontcopy
Source: C:\Users\Farser\Desktop\BASS_Files\music.mp3;  DestDir: {tmp}; Flags: dontcopy

Source: Images\Содержимое\{#Pic1}.bmp; Flags: dontcopy nocompression

[Icons]
Name: "{group}\{cm:UninstallProgram,World of Tanks}"; Filename: "{uninstallexe}"

[InstallDelete]
Name: {app}\res_mods\*; Type: filesandordirs; Check: IsChecked();

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


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

const
   
UNDEF_INDEX      = -777;
    ALPHA_BLEND_LEVEL = 230; // max=Byte=255

   
WS_EX_LAYERED    = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY    = 1;
    LWA_ALPHA        = 2;
    GWL_EXSTYLE      = (-20);

    Color = clblack;


type
   
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL;
    external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean;
    external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint;
    external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
    external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND;
    external 'SetFocus@user32.dll stdcall';


var
   
InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;
    deleteChk: TCheckBox;


function GetPreviousDir(const Buff: String): String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Buff);  //ветка реестра World of Tanks
   
if Buff <> '' then Result := RemoveBackslash(Buff);
end;

function InitializeSetup(): Boolean;
var
   
Buff: String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'UninstallString', Buff);
    Result := FileExists(RemoveQuotes(Buff));
    if not Result then MsgBox('Игра не найдена!', mbError, mb_ok);
end;


function IsChecked(): Boolean;
begin
   
Result := deleteChk.Checked;
end;


procedure ShowPicHint(const PicFilePath: String);
var
   
pt: TPoint;
begin
    if not
GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with
PicForm do
        begin
//            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
           
Left := ScaleX(700);    // Слева
           
Top := ScaleY(545);    // Сверху
           
Width := ScaleX(280);  // Ширина
           
Height := ScaleY(215);  // Высота
           
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
            Show;
        end;
    finally
       
SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
   
UndefPic: String;
begin
    if
Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case
TNewCheckListBox(Sender).ItemCaption[Index] of
           
'Зеленый': UndefPic := '{#Pic1}.bmp';
        else
            begin
               
LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
       
LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
   
PicForm.Hide;
end;


procedure InitInfo();
begin
   
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
       
BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
           
Parent := PicForm;
            AutoSize := True;
        end;
    end;
end;

procedure InitializeWizard();
var
   
i, iCount: Integer;
begin
   
InitInfo();
    WizardForm.TypesCombo.Visible := False;

    iCount := WizardForm.ComponentsList.Items.Count - 1;

    for i := iCount downto 0 do
     
WizardForm.ComponentsList.Checked[i]:= False;
     
    deleteChk := TCheckBox.Create(nil);
    with deleteChk do
    begin
       
Parent := WizardForm.SelectDirPage;
        SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
        Caption := 'Удалить старые компоненты';
        Checked := True;
    end;

    ExtractTemporaryFile('BASS.dll');
    ExtractTemporaryFile('CallbackCtrl.dll');
    ExtractTemporaryFile('botva2.dll');
    ExtractTemporaryFile('MusicButton.png');
    ExtractTemporaryFile('Music.mp3');

    BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
   
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 3, 465, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
   
BASS_DeInit; //Освобождаем процесс
   
gdipShutdown
end;



----------------------------------------------------
1specific
Пост #248

Nordek 26-01-2014 20:27 2296862

Цитата:

Цитата 1specific
И скажите еще пожалуйста, как здесь указать несколько версий виндус? »

MinVersion использовать совместно с OnlyBelowVersion

MinVersion - Минимальная версия Windows | начало т.е от
OnlyBelowVersion - Только ниже версия Windows | конец т.е до

Пример 1
Код:

[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 0,5.01; OnlyBelowVersion: 0,6.0

это значит начиная от Windows XP до Windows Vista т.е на Windows Vista уже не установится.

Пример 2
Код:

[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 0,6.0; OnlyBelowVersion: 0,6.2

это значит начиная от Windows Vista до Windows 8 т.е на Windows 8 уже не установится.

diman_21Ru 26-01-2014 21:16 2296894

Всем привет кто может помочь как можно что бы наводя на программу или мод картинка выходила в специальный уголок как на скрине !

saurn 26-01-2014 21:21 2296898

diman_21Ru, было несколькими страницами ранее http://forum.oszone.net/post-2296393-1949.html

diman_21Ru 26-01-2014 21:27 2296902

TAY50N,какие строчки ты именно добавил чтобы наводя на мод выходила картинка с боку ?

innot20 26-01-2014 21:54 2296910

а можете подсказать как сделать проверку на процесс WorldOfTanks.exe
если процесс включен, то установить дальше не возможно, пока не выключишь игру

nik1967 26-01-2014 22:19 2296919

innot20, шапка => Показать/скрыть: Ссылки на примеры скриптов: => Запущен ли процесс (WMI), Запущен ли процесс
Когда же вы будете сами что-то искать?

Farser21 26-01-2014 22:26 2296929

saurn , спасибо все работает!)

Nordek 27-01-2014 05:32 2297080

Вложений: 1
innot20,
Код:

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

[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('WorldOfTanks.exe', false) then
    begin
      if
MsgBox('Игра WorldOfTanks запущена. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
        begin
         
KillTask('WorldOfTanks.exe');
          Result:= True;
        end else
         
Exit;
    end;
Result:=True;
end;


Raf-9600 27-01-2014 14:12 2297233

Ктонить может подсказать, как правильно через секцию [Cоde] попросить cmd.exe, чтобы он запустил определённый батник? При том чтобы консольное окно не появлялось.

Пробовал вот так:
Код:

Exec(ExpandConstant('{cmd}'), '/c start "Delete empty folders" "' + ExpandConstant('{app}\Delete empty folders.bat') + '"', ExpandConstant('{app}'), SW_HIDE, ewWaitUntilTerminated, ResultCode)
Но в таком случае окно консоли появляется и само не закрывается...

Shkutu 27-01-2014 14:43 2297250

Raf-9600, батники можно запускать и без cmd, например так
Код:

Exec(ExpandConstant('{app}') + '\Delete empty folders.bat', '', '', SW_HIDE,
    ewWaitUntilTerminated, ResultCode);

А можно из командной строки так
Код:

Exec(ExpandConstant('{cmd}'), '/C ' + ExpandConstant('{app}') + '\Delete empty folders.bat' , '', SW_HIDE, ewWaitUntilTerminated, i)
Второй способ я пользовала не для .bat, а для .cmd файлов, но по идее должно быть аналогично

diman_21Ru 27-01-2014 14:52 2297260

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

[InstallDelete]
Type: filesandordirs; Name: "{app}\res_mods"; Check: IsChecked();

[Dirs]
Name: "{app}\res_mods"; Check: IsChecked();
Name: "{app}\res_mods\0.8.11 Common Test"; Check: IsChecked();

[code]

var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;
deleteChk: TCheckBox;

procedure InitializeWizard();
var
i, iCount: Integer;
begin

for i := iCount downto 0 do
WizardForm.ComponentsList.Checked[i]:= False;

deleteChk := TCheckBox.Create(nil);
with deleteChk do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
Caption := 'Удалить старые компоненты';
Checked := True;

function IsChecked(): Boolean;
begin
Result := deleteChk.Checked;
end;

TAY50N 27-01-2014 14:59 2297267

Цитата:

Цитата diman_21Ru
TAY50N,какие строчки ты именно добавил чтобы наводя на мод выходила картинка с боку ? »

читать дальше »
[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
UNDEF_INDEX = -777;
ALPHA_BLEND_LEVEL = 255; // max=Byte=255

WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);


var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;


type
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';

//////Картинка описания//////////
procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
InfoPic.SetBounds(ScaleX(247), ScaleY(65), ScaleX(232), ScaleY(237));
InfoPic.Show;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Удаляем видео заставку': UndefPic := '1.bmp';
'Часы в Ангаре': UndefPic := '2.bmp';
'от zayaz': UndefPic := '3.bmp';
'от ZCH_0933': UndefPic := '4.bmp';
else
begin
LastIndex := UNDEF_INDEX;
InfoPic.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
InfoPic.Hide;
LastIndex := -1;
end;


procedure InitInfo();
begin
WizardForm.TypesCombo.Hide;
WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(63), ScaleX(240), ScaleY(240));
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;

with TBevel.Create(WizardForm) do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(245), ScaleY(63), ScaleX(235), ScaleY(240));
Shape := bsFrame;
end;

InfoPic := TBitmapImage.Create(WizardForm)
with InfoPic do
begin
Parent := WizardForm.SelectComponentsPage;
AutoSize := True;
end;
end;

diman_21Ru 27-01-2014 15:01 2297268

TAY50N ,т.е второй надо делать а не как на первом ?

saurn 27-01-2014 15:08 2297273

Цитата:

Цитата diman_21Ru
делаю так чтобы удалить старые компоненты но выходит ошибка кто знает в чем проблема ? »

А ничего странного в глаза не бросается? Вот тут:
Код:

procedure InitializeWizard();
var
i, iCount: Integer;
begin

for i := iCount downto 0 do
WizardForm.ComponentsList.Checked[i]:= False;

deleteChk := TCheckBox.Create(nil);
with deleteChk do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
Caption := 'Удалить старые компоненты';
Checked := True;
Здесь должны быть две логические скобки end;
function IsChecked(): Boolean;
begin
Result := deleteChk.Checked;
end;


TAY50N 27-01-2014 15:45 2297307

diman_21Ru, вот:
http://forum.oszone.net/post-2296199-1941.html

saurn 27-01-2014 15:53 2297312

TAY50N
Ему нужен этот вариант. Обрезанный, с измененным родителем изображений.
читать дальше »
Код:

[code]
const
    UNDEF_INDEX = -777;
   
   
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';


var
    InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
   
   
procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    InfoPic.SetBounds(ScaleX(245), ScaleY(42), ScaleX(166), ScaleY(165));
    InfoPic.Show;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
    UndefPic: String;
begin
    if Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case TNewCheckListBox(Sender).ItemCaption[Index] of
            'Half-Life 2': UndefPic := 'Wasteland_Scanner_con.bmp';
            'Half-Life 2 Episode One': UndefPic := 'Strider_early2.bmp';
            'Half-Life 2 Episode Two': UndefPic := 'Cremator_poster.bmp';
            'Portal': UndefPic := 'Portal.bmp';
        else
            begin
                LastIndex := UNDEF_INDEX;
                InfoPic.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
        LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
    InfoPic.Hide;
    LastIndex := -1;
end;


procedure InitInfo();
begin
    WizardForm.TypesCombo.Hide;
    WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(37), ScaleX(225), ScaleY(176));
    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
   
    with TBevel.Create(WizardForm) do
    begin
      Parent := WizardForm.SelectComponentsPage;
      SetBounds(ScaleX(240), ScaleY(37), ScaleX(177), ScaleY(176));
      Shape := bsFrame;
    end;
   
    InfoPic := TBitmapImage.Create(WizardForm)
    with InfoPic do
    begin
        Parent := WizardForm.SelectComponentsPage;
        AutoSize := True;
    end;
end;


procedure InitializeWizard();
begin
    InitInfo();
end;

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

diman_21Ru 27-01-2014 16:00 2297318

TAY50N , у меня она выходит на середину как бы мне можно тут все поменять т.к расширить низ верх и сделать попопам как тут ?

saurn 27-01-2014 16:01 2297321

Цитата:

Цитата diman_21Ru
у меня она выходит на середину как бы мне можно тут все поменять т.к расширить низ верх и сделать попопам как тут ? »

Я код постом выше для кого выложил?

diman_21Ru 27-01-2014 16:07 2297326

saurn ,ошибка выходит с deleteChk .

saurn 27-01-2014 16:12 2297332

Цитата:

Цитата diman_21Ru
ошибка выходит с deleteChk »

Жуть. Давайте свой скрипт с минимальным набором файлов

diman_21Ru 27-01-2014 16:16 2297335

saurn =) http://rghost.ru/51965901 вот убрал deleteChk это чтобы не было ошибки

innot20 27-01-2014 16:48 2297344

Цитата:

Цитата Nordek
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[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('WorldOfTanks.exe', false) then
begin
if MsgBox('Игра WorldOfTanks запущена. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('WorldOfTanks.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end; »

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

saurn 27-01-2014 17:06 2297357

Вложений: 1
diman_21Ru, скрипт во вложении.

Shkutu 27-01-2014 17:58 2297378

Цитата:

Цитата innot20
пока не выключишь процесс »

В смысле, чтоб процесс пользователю руками выключать надо было?
Попробуй так
читать дальше »
[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;

var Page:TOutputMsgWizardPage;

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
 Page:=CreateOutputMsgPage(wpSelectComponents, "Внимание", "Игра WorldOfTanks запущена", "Игра WorldOfTanks запущена. Закройте, чтобы продолжить установку");
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if (CurPageID= Page.id) then
  begin
    if IsProcessRunning('WorldOfTanks.exe') then
    result:=false
    else
    result:=true;
  end
  else
  result:=true;
end;


saurn 27-01-2014 18:39 2297406

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

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


[code]
const
   
TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    TIMER_ID = 01;

type
   
TPROCESSENTRY32 = record
       
dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;

    TFNTimerProc = Longint;

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 SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; lpTimerFunc: TFNTimerProc): UINT; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; external 'KillTimer@user32.dll stdcall';


var
   
msgPage: TOutputMsgWizardPage;


function IsProcessRunning(FileName: String): Boolean;
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 TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
   
WizardForm.NextButton.Enabled := not IsProcessRunning('WorldOfTanks.exe');
end;


procedure InitializeWizard();
begin
   
msgPage := CreateOutputMsgPage(wpSelectComponents, 'Заголовок', 'Подзаголовок', 'Сообщение');
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageFromID(PageID) of
       
msgPage: Result := not IsProcessRunning('WorldOfTanks.exe');
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
   
KillTimer(WizardForm.Handle, TIMER_ID);
   
    case PageFromID(CurPageID) of
       
msgPage: if IsProcessRunning('WorldOfTanks.exe') then SetTimer(WizardForm.Handle, TIMER_ID, 30, CallbackAddr('TimerProc'));
    end;
end;


procedure DeinitializeSetup();
begin
   
KillTimer(WizardForm.Handle, TIMER_ID);
end;



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

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


[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';


var
   
msgPage: TOutputMsgWizardPage;


function IsProcessRunning(FileName: String): Boolean;
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;


function NextButtonClick(CurPageID: Integer): Boolean;
begin
   
Result := True;

    case PageFromID(CurPageID) of
       
msgPage:
        begin
            if not
IsProcessRunning('WorldOfTanks.exe') then Result := True
            else begin
               
MsgBox('Программа все еще запущена', mbError, MB_OK);
                Result := False;
            end;
        end;
    end;
end;


procedure InitializeWizard();
begin
   
msgPage := CreateOutputMsgPage(wpSelectComponents, 'Заголовок', 'Подзаголовок', 'Сообщение');
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageFromID(PageID) of
       
msgPage: Result := not IsProcessRunning('WorldOfTanks.exe');
    end;
end;


innot20 27-01-2014 19:05 2297413

saurn, запустил танки, запустил установщик и установил все моды без проблем, то что включен процесс сообщений не выдало

Nordek 27-01-2014 19:06 2297414

saurn,
Ошибочка:
Код:

procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
   
WizardForm.NextButton.Enabled := not IsProcessRunning('calc.exe');
end;

Код:

procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
   
WizardForm.NextButton.Enabled := not IsProcessRunning(''WorldOfTanks.exe');
end;

лучше тогда так:
Код:

#define KillExe "WorldOfTanks.exe"

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


[code]
const
   
TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    TIMER_ID = 01;

type
   
TPROCESSENTRY32 = record
       
dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;

    TFNTimerProc = Longint;

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 SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; lpTimerFunc: TFNTimerProc): UINT; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; external 'KillTimer@user32.dll stdcall';


var
   
msgPage: TOutputMsgWizardPage;


function IsProcessRunning(FileName: String): Boolean;
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 TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
begin
   
WizardForm.NextButton.Enabled := not IsProcessRunning('{#KillExe}');
end;


procedure InitializeWizard();
begin
   
msgPage := CreateOutputMsgPage(wpSelectComponents, 'Заголовок', 'Подзаголовок', 'Сообщение');
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageFromID(PageID) of
       
msgPage: Result := not IsProcessRunning('{#KillExe}');
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
   
KillTimer(WizardForm.Handle, TIMER_ID);

    case PageFromID(CurPageID) of
       
msgPage: if IsProcessRunning('{#KillExe}') then SetTimer(WizardForm.Handle, TIMER_ID, 30, CallbackAddr('TimerProc'));
    end;
end;


procedure DeinitializeSetup();
begin
   
KillTimer(WizardForm.Handle, TIMER_ID);
end;


diman_21Ru 27-01-2014 19:08 2297416

saurn , огромнейшее тебе спасибо :)

Nordek 27-01-2014 19:16 2297424

Цитата:

Цитата innot20
то что включен процесс сообщений не выдало »

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

saurn 27-01-2014 19:21 2297430

Цитата:

Цитата innot20
запустил танки, запустил установщик и установил все моды без проблем, то что включен процесс сообщений не выдало »

Тестировал на процессе калькулятора и забыл изменить в одном месте. Поправил. А так, все работает.

innot20 27-01-2014 20:07 2297450

Спасибо всем за помощь

Nordek 27-01-2014 20:57 2297472

Цитата:

Цитата saurn
А так, все работает. »

А я ещё раз повторю, что примеры на юникодной версии не будут работать.

saurn 27-01-2014 21:00 2297473

Цитата:

Цитата Nordek
на юникодной версии не будут работать »

Юникодовой никогда не пользовался. Про нее и слова не было. На ANSI все работает.

innot20 27-01-2014 21:23 2297487

помогите пожалуйста ещё сделать проверку на версию игры
считать версию игры можно 3 способами
1. файл version.xml
его содержимое:
Код:

<version.xml>
        <appname>        #menu:login/version        </appname>
        <version> v.0.8.11 Common Test #578</version> // цифра 578 может меняться у другого пользователя
        <showLicense>  0  </showLicense>
        <ingameHelpVersion>        1        </ingameHelpVersion>
        <meta>
                <client>368825</client>
                <overrides>368619</overrides>
                <localization>368469 RU</localization>
        </meta>
</version.xml>

2. у файла WorldOfTanks.exe в свойствах > подробно
есть версия файла
Код:

0.8.11.0
3. файл paths.xml
содержимое первых 3 строчек
Код:

<root>
  <Paths>
    <Path>./res_mods/0.8.11 Common Test</Path>


Gnom_aka_Lexander 27-01-2014 21:30 2297491

innot20, по версии файла встроенными функциями:
function GetVersionNumbers(const Filename: String; var VersionMS, VersionLS: Cardinal): Boolean;
VersionMS и VersionLS типа Cardinal объявить заранее, в них будут номера версии.
function GetVersionNumbersString(const Filename: String; var Version: String): Boolean;
тут номер версии вернется строкой.
Filename - полный путь к файлу, чью версию нужно узнать. справка - :up сила.

nik1967 27-01-2014 22:09 2297507

innot20, http://forum.oszone.net/post-2236471.html#post2236471

Nordek 28-01-2014 05:55 2297646

innot20, Если же в случае отсутствия файла допустить установку, то так:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.
DirExistsWarning=no

[Code]
function FileVersion(const FilePath: String): String;
var
 
oFS: Variant;
begin
 
oFS:= CreateOleObject('Scripting.FileSystemObject');
    try
     
Result:= oFS.GetFileVersion(FilePath);
    except
  end
;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
   
Result:= true;

    case CurPageID of
     
wpSelectDir:
      begin
        if
FileExists(ExpandConstant('{app}')+'\GameName.exe') then begin
          if
FileVersion(ExpandConstant('{app}')+'\GameName.exe') < '2.0.0.1' then begin
           
MsgBoxEx(WizardForm.Handle, 'На данную версию невозможно продолжить установку!', 'Не актуальная версия файла', MB_OK or MB_ICONWARNING, 0, 0);
            Result:= false;
          end;
        end;
      end;
    end;
end;

Цитата:

Цитата Gnom_aka_Lexander
по версии файла встроенными функциями »

Ну ты молодец, типа он понял что ты сказал.
Справка-то сила, но в пределах разумного.

Gnom_aka_Lexander 28-01-2014 10:43 2297726

Nordek, ты прям такой умный. Почему тогда не проверить версию файла встроенными средствами? Или только и умеешь, что криво переделывать чужие примеры? Делай тогда уже правильно, раз весь из себя такой великий гуру.
То, что ты как-бы переделал: у тебя на странице выбора папки нет положительного выхода, только отрицательный. делается это так:
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result:= true;
  case CurPageID of
    wpSelectDir:
    begin
      Result:= FileExists(ExpandConstant('{app}\GameName.exe'));
      if Result then
        Result := FileVersion(ExpandConstant('{app}\GameName.exe')) < '2.0.0.1';
      if not Result then
        MsgBoxEx(WizardForm.Handle, 'На данную версию невозможно продолжить установку!', 'Не актуальная версия файла', MB_OK or MB_ICONWARNING, 0, 0);
    end;
  end;
end;


далее на встроенной функции:
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
var
  Version: String;
begin
  Result:= true;
  case CurPageID of
    wpSelectDir:
    begin
      Result:= FileExists(ExpandConstant('{app}\GameName.exe'));
      if Result then
        Result:= GetVersionNumbersString(ExpandConstant('{app}\GameName.exe')), Version);
      if Result then
        Result := (Version < '2.0.0.1');
      if not Result then
        MsgBoxEx(WizardForm.Handle, 'На данную версию невозможно продолжить установку!', 'Не актуальная версия файла', MB_OK or MB_ICONWARNING, 0, 0);
    end;
  end;
end;

сложно что-ли набросать пример, если считаешь человека ущербным?
P.S.
Поскольку условий больше одного, то правильным будет оповестить, какое именно условие не дает идти дальше:
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
var
  Version, StrErr: String;
  i : Integer;
begin
  Result:= true;
  case CurPageID of
    wpSelectDir:
    begin
      i := 0;
      if not FileExists(ExpandConstant('{app}\GameName.exe'))then i := 1 else
        if not GetVersionNumbersString(ExpandConstant('{app}\GameName.exe'), Version) then i := 2 else
          if not (Version < '2.0.0.1') then i := 3;
      Result:= i=0;
      if not Result then
      begin
        case i of
          1 : StrErr := 'Не обнаружен файл '+ExpandConstant('{app}\GameName.exe');
          2 : StrErr := 'Невозможно определить версию файла';
          3 : StrErr := 'На данную версию невозможно продолжить установку!';
        end;
        MsgBox(StrErr, mbError,MB_OK);
      end;
    end;
  end;
end;


Nordek 28-01-2014 12:11 2297767

Gnom_aka_Lexander
Цитата:

Цитата Gnom_aka_Lexander
ты прям такой умный. »

В пределах разумного. Я у вас мистер хлеб украл? Чего же тогда когда нужно вы мистер не пример предоставили а пытались своими нравоучениями поучить?
Может всего на один раз нужно сделать инсталлятор - а для этого ничего учить не обязательно как и справки всякие читать.
Если человек всерьёз возьмётся за это дело - тогда да, и справочную информацию почитает и у вас спрашивать ничего не будет.

Цитата:

Цитата Gnom_aka_Lexander
делается это так: »

Можешь когда хочешь - для вытягивания ответа, нет ничего лучше чем манипуляция, даже если при этом придётся специально допустить ошибку.

Gnom_aka_Lexander 28-01-2014 12:23 2297772

Nordek,
читать дальше »
Знаешь, чем отличается помощь, от настоящей помощи? Сначала была именно помощь. потом - это уже не пример, а полностью готовый для использования код, и это уже не помощь. это уже действие, которое в итоге ведет к последующему зафлуживанию форумов, когда человек видя, что тут ему сделают все, что он хочет, начинает обижаться, когда именно ты ему начнешь отказывать, видя такую наглость. Это было неоднократно и будет не раз. именно поэтому нужно различать помощь и "сделайте за меня все". я не хочу сказать, что именно данный вопрошающий начнет именно так поступать. Я хочу сказать, что нужно заставлять людей думать и читать справки. не бывает неразумных пределов в чтении справки, поскольку там есть абсолютно все. А форумы в идеале нужны для того, что-бы разъяснять непонятные моменты. тут-же вопрос прозвучал - как сделать то-то. при чем простой поиск по справке по слову version моментально дает ответ на этот вопрос. вот если-бы человек спросил "как применить функцию GetVersionNumbers или GetVersionNumbersString", то тогда мой "пример" был-бы именно помощью. А в данной ситуации - это не помощь, а "сделай за меня"

Nordek 28-01-2014 13:24 2297814

Gnom_aka_Lexander
Цитата:

Цитата Gnom_aka_Lexander
Я хочу сказать, что нужно заставлять людей думать и читать справки. »

Gnom_aka_Lexander, Всех людей не переделаешь - с этим трудно не согласиться. Говорить про элитные функции и процедуры и давать советы типа "смотри в сторону GetVersionNumbers" - это как минимум глупо, исходя из того что человек даже не знает что такое функция в программном коде. Забудем на мгновение про литературу - т.к для лентяев это сверхчеловеческих возможностей и справки для них это миф. Ещё раз забудем на мгновение про литературу т.к ответы можно найти и здесь не заглядывая в книгу. Уже со счёта сбился сколько раз указал ссылку на 662 сообщение и это не единичный случай того, сколько раз здесь давались ответы на одни и те же вопросы. А если никто не ответит, создают одно и тоже сообщение за сообщением. Людям не то что лень что-то читать, но даже найти готовое.

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

XXXler 28-01-2014 16:19 2297948

Попытка добавления в реестр следующей записи вызывает при установке ошибку 87 в ф-ции RegCreateKeyEx - это баг Inno или я чего-то не знаю об экранировании одиночных кавычек?
Код:

Root: HKLM; SubKey: Microsoft\Windows\CurrentVersion\Control Panel\don't load; ValueType: string; ValueName: LClock.cpl; Components: soft\lclock; Flags: uninsdeletevalue

Nordek 28-01-2014 16:53 2297965

XXXler, Ты SOFTWARE пропустил:
Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\don't load; ValueType: string; ValueName: LClock.cpl; Flags: Flags: uninsdeletevalue


Shkutu 28-01-2014 18:12 2298022

Всем доброго времени суток!
А нет ли какого-нибудь примера по использованию эмуляции дефайнов/прагмы при компиляции из командной строки?
Надо передавать версию приложения через параметр в командной строке при компиляции, но не совсем понимаю, как это правильно сделать.

Ivan_009 28-01-2014 19:54 2298070

Возможно ли вот сюда загнать картинку которая в фоне самого инсталла...

Gnom_aka_Lexander 28-01-2014 20:00 2298074

Ivan_009, возможно. в расширенной версии есть для этого несколько функций. в папке с инно есть папка примеров, называется Examples, тебе нужен пример с названием Example_NewCheckListBox, там несколько разных фишек, тебе нужна только функция LoadBGBmpFromFile. Только вместо кастомного CheckListBox вписываешь свой - компонентлист или тасклист - чего там хочешь картинкой занавесить.

Nordek 28-01-2014 21:02 2298105

Ivan_009,

Код:

[Components]
Name: a; Description: A

[Files]
Source: "BGImage.bmp"; Flags: dontcopy solidbreak

[Code]
var
 
btnImgFile, BGImgFile: String;

procedure InitializeWizard();
begin
 
ExtractTemporaryFile('BGImage.bmp');
  BGImgFile := ExpandConstant('{tmp}\BGImage.bmp');
  WizardForm.ComponentsList.LoadBGBmpFromFile(BGImgFile, WizardForm.ComponentsList.Left, WizardForm.ComponentsList.Top);
end;

Дальше Gnom_aka_Lexander если что поправит.

nik1967 28-01-2014 21:18 2298117

Парни, хорош сраться! Пардонте за оффтоп.

Nordek 28-01-2014 21:25 2298122

nik1967, Да всё нормально.
А это
Цитата:

Цитата Nordek
Дальше Gnom_aka_Lexander если что поправит. »

из вежливости написал. Может я где ошибку допустил.

Ivan_009 28-01-2014 21:32 2298127

Nordek, Да и кстати как убрать замыленность текста потом...

Gnom_aka_Lexander 28-01-2014 21:47 2298144

Ivan_009,
Код:

WizardForm.ComponentsList.Font.Name := 'MS Sans Serif';
ты будешь смеяться, но так. Ну или отключить сглаживание ClearTipe для шрифта компонент-листа, чтоб не менять шрифт:
читать дальше »
Код:

type
  HFONT = LongWord;

function CreateFont(nHeight, nWidth, nEscapement, nOrientaion, fnWeight: Integer;
  fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision,
  fdwClipPrecision, fdwQuality, fdwPitchAndFamily: DWORD; lpszFace: PAnsiChar): HFONT;  external 'CreateFontA@gdi32.dll stdcall delayload';

procedure NewFont(Font : TFont);
begin
  Font.Handle := CreateFont(Font.Height, 0, 0, 0, 400, 0, 0, 0,0, 0, 0,0, 3, Font.Name); // предпоследний параметр поиграться от 0 до 4-х, не помню, чего там нужно ставить
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('BGImage.bmp');
  BGImgFile := ExpandConstant('{tmp}\BGImage.bmp');
  with WizardForm.ComponentsList do
  begin
    LoadBGBmpFromFile(BGImgFile, WizardForm.ComponentsList.Left, WizardForm.ComponentsList.Top);
    NewFont(font);
  end;
end;


Ivan_009 28-01-2014 23:18 2298192

Gnom_aka_Lexander, А если я хочу картинку не на ComponentsList а на всю форму чтобы было типа так.
То мне надо ее на BitmapImage ложить или на WizardForm...

Gnom_aka_Lexander 29-01-2014 07:34 2298296

Вложений: 1
Ivan_009, не так. тебе нужно положить BitmapImage на WizardForm и все, что лежит между WizardForm и ComponentsList
Я делал так вставку картинки на все страницы, мож кому пригодится.

Ivan_009 29-01-2014 07:50 2298299

Gnom_aka_Lexander, Так:

Код:

BGBitmapImage := TBitmapImage.Create(WizardForm);
BGBitmapImage.Parent := WizardForm;
BGBitmapImage.Align := alClient;
BGBitmapImage.SendToBack;
BGBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\BGImage.bmp'))


Gnom_aka_Lexander 29-01-2014 08:11 2298303

Ivan_009, примерно. это если компонент-лист лежит у тебя прямо на WizardForm. тогда отдельно распаковывать файл изображения для компонентлиста не обязательно, можно взять битмап изображения с BGBitmapImage и вместо LoadBGBmpFromFile использовать LoadBGBmpFromBitmap:
Код:

WizardForm.ComponentsList.LoadBGBmpFromBitmap(BGBitmapImage.Bitmap, WizardForm.ComponentsList.Left, WizardForm.ComponentsList.Top);

Ivan_009 29-01-2014 12:25 2298409

Gnom_aka_Lexander, Если я правильно понял то как то так:

Код:


var
BGBitmapImage: TBitmapImage;

procedure InitializeWizard();
begin
ExtractTemporaryFile('BGImage.bmp');

BGBitmapImage := TBitmapImage.Create(WizardForm);
BGBitmapImage.Parent := WizardForm;
BGBitmapImage.Align := alClient;
BGBitmapImage.SendToBack;
BGBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\BGImage.bmp'))

with WizardForm.ComponentsList do
begin
//BorderStyle := bsNone;
Parent := WizardForm;
SetBounds(ScaleX(110), ScaleY(180), ScaleX(350), ScaleY(120));
Font.Color:=$FFFFFF;
Font.Name:='MS Sans Serif';
Font.Size:= 9;
TreeViewStyle := True;

WizardForm.ComponentsList.LoadBGBmpFromBitmap(BGBitmapImage.Bitmap, WizardForm.ComponentsList.Left, WizardForm.ComponentsList.Top);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.ComponentsList.Hide;
BGBitmapImage.Hide;
case CurPageID of
wpSelectComponents:
begin
WizardForm.ComponentsList.Show;
BGBitmapImage.Show;
end;
end;
end;


Nordek 29-01-2014 13:31 2298448

Цитата:

Цитата Gnom_aka_Lexander
Ну или отключить сглаживание ClearTipe для шрифта компонент-листа »

А я то всю голову ломал, что за замыленность. ClearType по умолчанию то стоит, и ошибкой не посчитал.

Цитата:

Цитата Gnom_aka_Lexander
ты будешь смеяться »

Ничего смешного, MS Sans Serif - волшебный шрифт.
Далее не относится к теме, но относится к шрифту:
Gnom_aka_Lexander, Ты возможно тоже будешь удивлён, но в "C:\Program Files\Inno Setup 5\ISLanguages"
в файле "Russian_ansi.lng" (у меня Tahoma в нём по умолчанию) если заменить DialogFontName=Tahoma на DialogFontName=MS Sans Serif то в Inno Setup Compiler будут отображаться русские буквы вместо непонятных иероглифов.

Ivan_009, И как, нормально компилится?
В WizardForm.ComponentsList под TreeViewStyle := True; лишний end; убери.

Gnom_aka_Lexander 29-01-2014 14:43 2298501

Цитата:

Цитата Ivan_009
BGBitmapImage.Show; »

картинка только на странице компонентов, чтоли?
Цитата:

Цитата Nordek
А я то всю голову ломал, что за замыленность. »

дело не в замыленности как таковой, там именно из-за сглаживания и именно Cleartype целая куча артефактных явлений - утолщение шрифта при каждом клике, до полного закрашивания и еще какие-то глюки вроде были. и я помню всю голову сломал и уж никак на шрифт не думал. Sans Serif - потому что он старый и не имеет механизма сглаживания Cleartype. скорей всего еще какие-то можно использовать из старых в этой ситуации, я не искал, предпочитаю Tahoma и отключение Cleartype там, где он вызывает глюки.
Цитата:

Цитата Nordek
русские буквы вместо непонятных иероглифов. »

для меня неактуально. я так и не смог поймать такой смешной и где-то даже интересный глюк. ни разу.

Ivan_009 29-01-2014 15:01 2298517

Цитата:

Цитата Gnom_aka_Lexander
картинка только на странице компонентов, чтоли? »

Gnom_aka_Lexander, У меня на остальных через Ботву наложена. Или может как нибудь подругому надо..

Как обьеденить ComponentsList и TasksList в одну страницу...

Nordek 29-01-2014 20:58 2298796

Цитата:

Цитата Ivan_009
Как обьеденить ComponentsList и TasksList в одну страницу »

Это вопрос?

Хочешь так:
Код:

[Code]
procedure InitializeWizard();
begin
  with
WizardForm.ComponentsList do
  begin
   
Parent := WizardForm.SelectTasksPage;
    Width := ScaleX(193);
    Top := ScaleY(37);
    Height := ScaleY(168);
  end;

  with WizardForm.ComponentsDiskSpaceLabel do
  begin
   
Parent := WizardForm.SelectTasksPage;
  end;

  with WizardForm.TypesCombo do
  begin
   
Visible := False;
  end;

  with WizardForm.TasksList do
  begin
   
Left := ScaleX(208);
    Width := ScaleX(209);
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
 if
(PageID =wpSelectComponents) then Result:= True;
end;

а хочешь так:
Код:

[Code]
procedure InitializeWizard();
begin
 
WizardForm.ComponentsList.Parent := WizardForm.SelectTasksPage;
  WizardForm.ComponentsList.Width := ScaleX(193);
  WizardForm.ComponentsList.Top := ScaleY(37);
  WizardForm.ComponentsList.Height := ScaleY(168);
  WizardForm.ComponentsDiskSpaceLabel.Parent := WizardForm.SelectTasksPage;
  WizardForm.TypesCombo.Visible := False;
  WizardForm.TasksList.Left := ScaleX(208);
  WizardForm.TasksList.Width := ScaleX(209);
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
 if
(PageID =wpSelectComponents) then Result:= True;
end;


Выбирай как больше нравится.

Ivan_009 29-01-2014 21:23 2298809

Nordek, У меня все на WizardForm лежит. Эти примеры не работают... :(

Nordek 29-01-2014 21:55 2298824

Цитата:

Цитата Ivan_009
У меня все на WizardForm лежит. »

Не понял.

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

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

[Components]
Name: a; Description: A

[Tasks]
Name: a; Description: A

[Code]
procedure RedesignWizardForm;
begin
 
WizardForm.ComponentsList.Parent := WizardForm.SelectTasksPage;
  WizardForm.ComponentsList.Width := ScaleX(193);
  WizardForm.ComponentsList.Top := ScaleY(37);
  WizardForm.ComponentsList.Height := ScaleY(168);
  WizardForm.ComponentsDiskSpaceLabel.Parent := WizardForm.SelectTasksPage;
  WizardForm.TypesCombo.Visible := False;
  WizardForm.TasksList.Left := ScaleX(208);
  WizardForm.TasksList.Width := ScaleX(209);
end;

procedure InitializeWizard();
begin
 
RedesignWizardForm;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
 if
(PageID =wpSelectComponents) then Result:= True;
end;


saurn 29-01-2014 22:12 2298832

Цитата:

Цитата Ivan_009
У меня все на WizardForm лежит. Эти примеры не работают... »

Так измените родителя на WizardForm, и в CurPageChanged определите скрытие\показ элементов.
Простой пример
Код:

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


[Tasks]
Name: task; Description: task;


[Components]
Name: component; Description: component; Types: full;


[Code]
procedure InitializeWizard();
begin
   
WizardForm.InnerNotebook.Hide;
    WizardForm.TypesCombo.Hide;
    WizardForm.ComponentsList.Parent := WizardForm;
    WizardForm.ComponentsList.SetBounds(ScaleX(37), ScaleY(102), ScaleX(200), ScaleY(170));
    WizardForm.ComponentsDiskSpaceLabel.Hide;
    WizardForm.TasksList.Parent := WizardForm;
    WizardForm.TasksList.SetBounds(ScaleX(WizardForm.ComponentsList.Left + 220), ScaleY(102), ScaleX(200), ScaleY(170));
    WizardForm.TasksList.BorderStyle := bsSingle;
    WizardForm.TasksList.Color := $FFFFFF;
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case
PageID of
       
7: Result := True;
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
   
WizardForm.ComponentsList.Hide;
    WizardForm.TasksList.Hide;
   
    case CurPageID of
       
9:
        begin
           
WizardForm.ComponentsList.Show;
            WizardForm.TasksList.Show;
        end;
    end;
end;


Nordek 29-01-2014 22:35 2298849

Ivan_009, Если вешать на SelectComponentsPage, то задач не будет пока не перейдёшь на страницу самих задач. А когда возвратишься к компонентам то задачи появятся.
Если так же секции [Components] не будет, то и вовсе будет скрыто - в этом случае можно было бы повесить на SelectTasksPage. Но опять же если секции [Tasks] не будет, то и компоненты будут скрыты.
Можно повесить на новую страницу:
читать дальше »
Код:

[Code]
var
 
PageComTasks: TWizardPage;
 
procedure InitializeWizard();
begin

 
PageComTasks := CreateCustomPage(wpSelectTasks, 'Caption', 'Description');
 
  WizardForm.ComponentsList.Parent := PageComTasks.Surface;
  WizardForm.ComponentsList.Width := ScaleX(193);
  WizardForm.ComponentsList.Top := ScaleY(43);
  WizardForm.ComponentsList.Height := ScaleY(168);
  WizardForm.ComponentsDiskSpaceLabel.Parent := PageComTasks.Surface;
  WizardForm.ComponentsDiskSpaceLabel.AutoSize := True;
  WizardForm.TasksList.Parent := PageComTasks.Surface;
  WizardForm.TasksList.Left := ScaleX(208);
  WizardForm.TasksList.Width := ScaleX(209);
  WizardForm.TasksList.Top := ScaleY(43);
 
  WizardForm.SelectComponentsLabel.Parent := PageComTasks.Surface;

end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
 if
(PageID =wpSelectComponents) or(PageID =wpSelectTasks) then Result:= True;
end;


но и тут не без нюансов - если секций [Components] и [Tasks] не будет, то будет пустая страница.

diman_21Ru 30-01-2014 14:33 2299221

Всем привет ! как добавить в установщик функцию нахождение игры ?

Nordek 30-01-2014 15:56 2299304

diman_21Ru, Как я прав:
Цитата:

Цитата Nordek
Людям не то что лень что-то читать, но даже найти готовое. »

Сообщение #1953, Сообщение #1960.

Если покопаться, можно с десяток таких найти.

novahudonoser 30-01-2014 16:08 2299324

Ребят не ругайтесь, я посмотрел примеры, не нашёл
может плохо искал, хз
задача такая, по окончании установки в окне финиша нужна галка "открыть страницу в интернете" с ссылкой на сайт
сейчас имеется:
[Run]
Filename: "{app}\TimeCalculator.exe"; Description: "Запустить программу"; Flags: nowait postinstall skipifsilent
Filename: "{app}\TimeCalculator.chm"; Description: "Открыть справку"; Flags: shellexec nowait postinstall skipifsilent

diman_21Ru 30-01-2014 16:13 2299335

Nordek ,спасибо :)

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

saurn 30-01-2014 17:04 2299371

Цитата:

Цитата novahudonoser
задача такая, по окончании установки в окне финиша нужна галка "открыть страницу в интернете" с ссылкой на сайт »

Код:

[Run]
Filename: http://forum.oszone.net; Description: Открыть сайт в окне браузера; Flags: postinstall nowait shellexec;


diman_21Ru 30-01-2014 17:40 2299393

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

innot20 30-01-2014 17:55 2299401

Код:

[Run]
Filename: "{app}\WorldOfTanks.exe"; Description: "Запустить World Of Tanks после установки?";  Flags: unchecked postinstall shellexec;


diman_21Ru 30-01-2014 18:00 2299404

innot20 ,спасибо

Nordek 30-01-2014 18:01 2299405

Цитата:

Цитата novahudonoser
задача такая, по окончании установки в окне финиша нужна галка "открыть страницу в интернете" с ссылкой на сайт »

Ещё можно открыть определённым браузером:
Код:

[Run]
Filename: {pf}\Internet Explorer\iexplore.exe; Parameters: http://www.site.ru/; Flags: postinstall; Description: Посетить сайт

Цитата:

Flags:
postinstall

postinstall - После установки
Действителен только в секции [Run]. Указывает инсталлятору создать задание с флажком (checkbox) на странице мастера Установка завершена. Пользователь может выбрать из предложенного списка параметры, которые он хочет запустить или отменить. Раньше этот флаг назывался showcheckbox.

Если инсталлятор должен перезагрузить компьютер пользователя (после установки файла с флагом restartreplace или если в секции [Setup] директива AlwaysRestart=yes), страница с флажком для выбора не сможет отобразиться и из-за этого параметр не запустится.

Флаг isreadme для параметров секции [Files] теперь не нужен. Если компилятор обнаружит флаг isreadme, он его удалит и заменит соответствующим заданием секции [Run] в начале этой секции. У этого задания будут флаги shellexec, skipifdoesntexist, postinstall и skipifsilent.
shellexec

shellexec - Исполняется оболочкой
Этот флаг можно использовать, только если в Filename задан не исполняемый файл (не .exe и не .com). Когда флаг установлен, Filename может быть папкой или любым зарегистрированым типом файла - включая .hlp, .doc и т.д. Файл будет отрыть программой по умолчанию для его типа. То же произойдет, если пользователь дважды кликнет мышью на файле в окне Проводника.

По умолчанию, при использовании флага shellexec, инсталлятор не будет ждать, пока завершится запущенный процесс. Если необходимо, чтобы инсталлятор подождал завершения выполнения процесса, следует комбинировать флаг shellexec с флагом waituntilterminated. Обратите внимание, что инсталлятор не будет ждать окончания процесса, если, например, в Filename указана папка. (Note that it cannot and will not wait if a new process isn't spawned -- for example, if Filename specifies a folder).
unchecked

unchecked - Переключатель не выбран
Действует только в секции [Run]. Указывает инсталлятору не ставить флажок в строке с параметром. Пользователь может его выбрать, если захочет его запустить. Этот флаг игнорируется, если также установлен флаг postinstall.


diman_21Ru 30-01-2014 18:15 2299411

а любой браузер туда вписать можно ?

Nordek 30-01-2014 18:19 2299412

Цитата:

Цитата diman_21Ru
а любой браузер туда вписать можно ? »

Да, при условии если он установлен в системе и знаешь к нему расположение исполняемого файла.

Варианты по умолчанию:
Google Chrome:
Код:

[Run]
Filename: {localappdata}\Google\Chrome\Application\chrome.exe; Parameters: http://www.site.ru/; Flags: postinstall; Description: Посетить сайт

Код:

[Run]
Filename: {pf}\Google\Chrome\Application\chrome.exe; Parameters: http://www.site.ru/; Flags: postinstall; Description: Посетить сайт

Mozilla Firefox:
Код:

[Run]
Filename: {pf}\Mozilla Firefox\firefox.exe; Parameters: http://www.site.ru/; Flags: postinstall; Description: Посетить сайт

Opera:
Код:

[Run]
Filename: {pf}\Opera\opera.exe; Parameters: http://www.site.ru/; Flags: postinstall; Description: Посетить сайт

Код:

[Run]
Filename: {pf}\Opera\launcher.exe; Parameters: http://www.site.ru/; Flags: postinstall; Description: Посетить сайт


diman_21Ru 30-01-2014 18:37 2299423

Nordek , не знаешь как функцию включить обнаружение ярлыка при выборе папки чтобы в другую не устанавливать а именно в эту , как у Jove в мод-паке !

alert30 30-01-2014 18:47 2299426

diman_21Ru, не проще бы справку качнуть? :read:

diman_21Ru 30-01-2014 18:57 2299434

что за справка ещё ?

qqwwaass 30-01-2014 19:00 2299436

Сообщение удалено.

Shkutu 30-01-2014 19:03 2299439

Приветствую всех!
Есть вопрос. Нужно задавать версию приложения как параметр командной строки при компиляции.
Пробовала так
Код:

"C:\Program Files (x86)\Inno Setup 5\iscc" /dMyAppVersion=7.5.2 "D:\ucs\ressrv.iss"
Но дефайн не переприсваивается
И так
Код:

AppVersion= {#MyVersion}  - в коде
"C:\Program Files (x86)\Inno Setup 5\iscc" /dMyVersion=7.5.2 /pu+  "D:\ucs\ressrv.iss"

Так ругается, что AppVersion не определено.
Может, кто подскажет, как это правильно можно сделать?

Nordek 30-01-2014 19:42 2299468

Shkutu,
Код:

"C:\Program Files (x86)\Inno Setup 5\iscc" "/dMyAppVersion=7.5.2" "D:\ucs\ressrv.iss"
Если у тебя в коде AppVersion={#MyVersion} то
Код:

"C:\Program Files (x86)\Inno Setup 5\iscc" "/dMyVersion=7.5.2" "D:\ucs\ressrv.iss"
Надеюсь ты понимаешь что в коде не должно быть #define MyVersion "1.5" иначе в AppVersion запишется версия то что в коде т.е #define MyVersion "1.5"

alert30 30-01-2014 20:21 2299501

diman_21Ru, http://i.imgur.com/hH7GmTR.png

Nordek 30-01-2014 21:05 2299523

alert30, А поаккуратней нельзя?

Это форум, а не помойка трупов на утилизацию.

Тем более всё выкачивать не обязательно. Достаточно Русской справки в формате .chm - в неё вошло большинство инфы из того что есть в шапке.

Mad Max 31-01-2014 12:45 2299799

Подскажите как попроще сделать апдейт и анинстал?

alert30 31-01-2014 15:23 2299934

Цитата:

Цитата Nordek
А поаккуратней нельзя? »

Могу сделать по-аккуратнее, но это займет много времени.

saurn 31-01-2014 17:33 2300030

Цитата:

Цитата Mad Max
Подскажите как попроще сделать апдейт и анинстал? »

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

diman_21Ru 31-01-2014 22:46 2300262

Всем привет можно ли как у Jove в мод-паке сделать выбираешь папку с игрой если найдет ярлык игры то моды ставятся именно туда , зарание спасибо :)

saurn 01-02-2014 00:00 2300308

diman_21Ru, в качестве примера: если в выбранной папке найден требуемый файл, в качестве пути установки будет выбран путь к корневой папке файла, если не найден, путь установки сбросится на дефолтный.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
AppendDefaultDirName=no
OutputDir=...


[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: overwritereadonly ignoreversion;


[Code]
function SearchFile(const Path: String; const Name: String): Boolean;
var
   
DefaultPath: String;
begin
   
DefaultPath := ExpandConstant('{#SetupSetting("DefaultDirName")}');
    Result := FileExists(AddBackslash(Path) + Name);
    case Result of
       
True: WizardForm.DirEdit.Text := Path;
        False:
        begin
           
Result := (WizardForm.DirEdit.Text = DefaultPath);
            if Result then Exit;
            case MsgBox('В данной папке отсутствуют файлы игры. Путь установки будет сброшен на значение по умолчанию.', mbError, MB_OK) of
               
1: WizardForm.DirEdit.Text := DefaultPath;
            end;
        end;
    end;
end;


procedure DirEditOnChange(Sender: TObject);
begin
   
SearchFile(WizardDirValue(), 'MyProg.exe');
end;


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


diman_21Ru 01-02-2014 00:08 2300313

saurn ,что то не получилось (

saurn 01-02-2014 00:29 2300328

Цитата:

Цитата diman_21Ru
что то не получилось ( »

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

procedure DirEditOnChange(Sender: TObject);
begin
   
SearchFile(WizardDirValue(), //Путь к папке, в которой производится поиск файла. В данном случае путь берется из DirEdit.
   
'MyProg.exe'); //Имя файла, который ищем.
end;


diman_21Ru 01-02-2014 00:31 2300332

ок попробую

diman_21Ru 01-02-2014 10:32 2300454

вообще не как не получается кто сможет в скрипт добавить !

dr.alexa2000@vk 01-02-2014 11:48 2300477

Есть код, в котором при деинсталляции удаляется папка с сохранениями:
Код:

procedure DeleteSavedGames(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep=usUninstall then
  if DirExists(ExpandConstant('{userdocs}')+'\Assassin's Creed Revelations' then
  if MsgBox(ExpandConstant('{cm:DeleteSave}'), mbInformation, MB_YESNO) = idYes then
  DelTree(ExpandConstant('{userdocs}')+'\Assassin's Creed Revelations', True, True, True)
end;

Но т.к. папка Assassin's Creed Revelations содержит знак ' (кавычку), то inno setup не понимает что надо удалить эту папку.
Как исправить?

Ivan_009 01-02-2014 11:51 2300479

diman_21Ru, Путь надо указать пример запуск игры после установки

Код:

var
RunEXE: TNewButton;

procedure LaunchButtonOnClick(Sender: TObject);
var
ErrorCode: integer;
begin
Exec(ExpandConstant('{app}') + '\MyProg.exe',' ', ExpandConstant('{app}'), SW_HIDE, ewNoWait, ErrorCode);
SendMessage(WizardForm.NextButton.handle, $F5, 0, 0);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpFinished then begin
RunEXE := TNewButton.Create(WizardForm);
with RunEXE do
begin
Name := 'RunEXE';
Parent := WizardForm;
Left := ScaleX(104);
Top := ScaleY(328);
Width := ScaleX(120);
Height := ScaleY(23);
Caption := ' ';
OnClick:= @LaunchButtonOnClick;
end;
end;
end;

Как сделать свернуть и закрыть через лейбл.Зарание спасибо...

diman_21Ru 01-02-2014 16:22 2300637

Ivan_009, попрежнему моды ставятся в любую папку (

saurn 01-02-2014 16:58 2300656

Цитата:

Цитата dr.alexa2000@vk
Но т.к. папка Assassin's Creed Revelations содержит знак ' (кавычку), то inno setup не понимает что надо удалить эту папку. Как исправить?»

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

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


[CustomMessages]
CM_DEL_SAVE=Удалить также сохранения игры и профили игроков, находящиеся в следующем расположении:%n%n


[Code]
#define SaveDir "Assassin''s Creed Revelations"


function DeleteSavedGames(): Boolean;
var
   
SavingFolderPath: String;
begin
   
SavingFolderPath := ExpandConstant('{userdocs}\{#SaveDir}');
    Result := DirExists(SavingFolderPath);
    if not Result then Exit;
    case MsgBox(CustomMessage('CM_DEL_SAVE') + AddQuotes(SavingFolderPath), mbConfirmation, MB_YESNO) of
       
6: DelTree(SavingFolderPath, True, True, True);
    end;
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case
CurUninstallStep of
       
usPostUninstall: DeleteSavedGames();
    end;
end;


Nightwishh 01-02-2014 20:29 2300806

Всем добрый вечер. Хочу спросить:
1) Можно ли сделать объект WizardForm.InfoBeforeMemo без заднего фона (т.е. прозрачным) (без ботвы) и если нет, то какой объект можно взять вместо него у которого есть прозрачность и скроллбар?
2) Чем отличается
Код:

SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
от
Код:

WizardForm.Close
и что лучше?
3) С чем связана ошибка Память не может быть read. Появляется она один раз после установки когда нажимаешь на кнопку заершить и больше она не появляется, хоть сто раз устанавливай.
Спасибо!!!

diman_21Ru 01-02-2014 21:01 2300816

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

Tco 03 02-02-2014 08:08 2301027

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

dr.alexa2000@vk 02-02-2014 09:02 2301039

Вложений: 1
Цитата:

saurn
Не получилось, прикрепил весь скрипт к сообщению,исправьте,пожалуйста...
Ваш код я вставил на 1420 строке.

saurn 02-02-2014 09:40 2301044

Вложений: 1
Цитата:

Цитата dr.alexa2000@vk
Не получилось »

Процедура CurUninstallStepChanged была объявлена дважды. Скрипт во вложении.

Ivan_009 02-02-2014 11:15 2301088

Почему шрифт отображается на разных системах поразному? Как добиться идентичности отображения...
P.S Шрифт был использован "Trebuchet MS" тест на Win 7 и Win XP...

diman_21Ru 02-02-2014 11:16 2301089

ответьте пожалуйста на мой вопрос кто знает , очень нужна 'та функция что писал выше, зарание спасибо

Ivan_009 02-02-2014 11:30 2301094

diman_21Ru, Через реестр так:

читать дальше »
[Setup]
AppName=MyApp
AppverName=MyApp
DefaultDirName={pf}\MyApp

[Registry]
Root: HKLM; Subkey: SOFTWARE\MyApp; ValueName: InstallPath; ValueType: string; ValueData: {app}; Flags: uninsdeletekey

[code]
function InitializeSetup(): Boolean;
begin
Result:= True;
if RegValueExists(HKLM, 'SOFTWARE\MyApp', 'InstallPath') then begin
MsgBox('Копия данной программы уже установлена! Установка будет прекращена', mbConfirmation, MB_OK);
Result:= False;
end;
end;

saurn 02-02-2014 11:32 2301096

diman_21Ru, чем не устраивает такой вариант?

diman_21Ru 02-02-2014 16:38 2301249

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

dr.alexa2000@vk 02-02-2014 16:44 2301254

Цитата:

Цитата saurn
saurn »

Инсталляция проходит нормально, при деинсталляции ошибка:
Runtime Error (at 284:38)
Внутренняя ошибка: An attempt was made to access
UninstallProgressForm before it has been created.

Nightwishh 02-02-2014 18:02 2301322

Парни ну помогите мне с моими вопросами, надо очень :)

saurn 02-02-2014 19:21 2301397

Цитата:

Цитата diman_21Ru
А как исправить лишние разы Путь установки будет сброшен на значение по умолчанию , допустим диск раздел выбераешь уже Путь установки будет сброшен на значение по умолчанию потом папку с игрой уже Путь установки будет сброшен на значение по умолчанию тока лишь на саму игры уже нету ошибки »

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

[Code]
function SearchFile(const Path: String; const Name: String): Boolean;
begin
    case
FileExists(AddBackslash(Path) + Name) of
       
True: WizardForm.DirEdit.Text := Path;
        False: WizardForm.DirEdit.Text := ExpandConstant('{#SetupSetting("DefaultDirName")}');
    end;
end;


procedure DirEditOnChange(Sender: TObject);
begin
   
SearchFile(WizardDirValue(), 'MyProg.exe');
end;


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


Цитата:

Цитата dr.alexa2000@vk
Инсталляция проходит нормально, при деинсталляции ошибка:
Runtime Error (at 284:38)
Внутренняя ошибка: An attempt was made to access
UninstallProgressForm before it has been created. »

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

diman_21Ru 02-02-2014 21:50 2301483

saurn,спасибо :)

Ivan_009 02-02-2014 21:54 2301486

Как через код включить сглаживание шрифта в Windows XP...

Nordek 02-02-2014 22:23 2301499

Цитата:

Цитата diman_21Ru
saurn,спасибо »

Как я могу отметить сообщение полезным?

diman_21Ru 02-02-2014 23:04 2301526

отметил уже

habib2302 03-02-2014 00:04 2301553

доброе время суток. помогите решить проблему

saurn 03-02-2014 00:42 2301582

habib2302, дословно: "Неизвестный идентификатор ImgLoad". Копайте в сторону ботвы.
читать дальше »
Код:

function ImgLoad(Wnd :HWND; FileName :PAnsiChar; Left, Top, Width, Height :integer; Stretch, IsBkg :boolean) :Longint; external 'ImgLoad@{tmp}\botva2.dll stdcall delayload';
//загружает изображение в память, сохраняет переданные параметры
//Wnd          - хэндл окна, в котором будет выведено изображение
//FileName    - файл изображения
//Left,Top    - координаты верхнего левого угла вывода изображения (в координатах клиентской области Wnd)
//Width,Height - ширина, высота изображения
//              если Stretch=True, то изображение будет растянуто/сжато в прямоугольной области
//              Rect.Left:=Left;
//              Rect.Top:=Top;
//              Rect.Right:=Left+Width;
//              Rect.Bottom:=Top+Height;
//              если Stretch=False, то параметры Width,Height игнорируются и вычисляются самой ImgLoad, т.е. можно передать 0
//Stretch      - масштабировать изображение или нет
//IsBkg        - если IsBkg=True, изображение будет выведено на фоне формы,
//              поверх него будут отрисованы графические объекты (TLabel, TBitmapImage и т.д.),
//              затем поверх всего будут выведены изображения с флагом IsBkg=False
//возвращаемое значение - указатель на структуру, хранящей изображение и его парметры, приведенный к типу Longint
//изображения будут выведены в той последовательности, в которой вызывается ImgLoad


innot20 03-02-2014 06:57 2301637

Здравствуйте, подскажите пожалуйста как сделать backup папки res-mods

saurn 03-02-2014 18:22 2301971

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

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion;


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


procedure IsBackup(const FromDir: String; const ToDir: String);
var
   
fileArray: array of String;
    FindFiles: TFindRec;
    i, Len: Integer;
begin
    if not
DirExists(FromDir) then Exit;
    fileArray := ['*'];
    Len := GetArrayLength(fileArray) - 1;
    for i := 0 to Len do
    begin
        if
FindFirst(FromDir + fileArray[i], FindFiles) then
        try
            repeat
                if not
DirExists(ToDir) then CreateDir(ToDir);
                  MoveFile(FromDir + FindFiles.Name, ToDir + FindFiles.Name);
            until not FindNext(FindFiles);
        finally

           
FindClose(FindFiles);
        end;
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall: IsBackup(ExpandConstant('{app}\res-mods\'), ExpandConstant('{app}\Backup\'));
    end;
end;


Ivan_009 03-02-2014 18:40 2301982

Как удалить иконку в левом верхнем углу...

saurn 03-02-2014 18:44 2301987

Ivan_009
Код:

WizardForm.BorderStyle := bsDialog; //или BorderIcons := [];

Ivan_009 03-02-2014 18:58 2301999

saurn, А чтобы кнопка свернуть и закрыть только осталась...

Nordek 03-02-2014 19:30 2302022

Ivan_009, Когда же ты перейдёшь на расширенную версию и воспользуешься Дизайнером диалогов:

Ivan_009 03-02-2014 20:03 2302051

Как зделать вот так без использования различных библиотек включая IsPicture2...

saurn 03-02-2014 20:25 2302066

Ivan_009, http://forum.oszone.net/post-2074787-1586.html

diman_21Ru 03-02-2014 21:30 2302115

innot20 ,Здравствуйте, подскажите пожалуйста как сделать backup папки res-mods , А можно ли кнопку добавить к сохранением папки модов ?

Ivan_009 03-02-2014 22:42 2302151

Цитата:

Цитата Ivan_009
Как удалить иконку в левом верхнем углу... »

Собственно не нашел как удалить. Зато можно сменить, чтобы ее невидно совсем было...

Может кому пригодится :wink:

saurn 03-02-2014 22:48 2302153

Цитата:

Цитата diman_21Ru
А можно ли кнопку добавить к сохранением папки модов ? »

Можно кнопку, можно и страницу:
читать дальше »
Код:

#define CUR_DIR "res-mods"
#define BAK_DIR "old_res-mods"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion;


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
   
pageBackup: TInputDirWizardPage;


procedure IsBackup(const FromDir: String; const ToDir: String);
var
   
fileArray: array of String;
    FindFiles: TFindRec;
    i, Len: Integer;
begin
   
fileArray := ['*'];
    Len := GetArrayLength(fileArray) - 1;
    for i := 0 to Len do
    begin
        if
FindFirst(FromDir + fileArray[i], FindFiles) then
        try
           
WizardForm.ProgressGauge.Hide;
            WizardForm.StatusLabel.Caption := 'Создание резервной копии файлов...';
           
            repeat
                if not
DirExists(ToDir) then CreateDir(ToDir);
                  MoveFile(FromDir + FindFiles.Name, ToDir + FindFiles.Name);
            until not FindNext(FindFiles);
        finally
       
           
WizardForm.ProgressGauge.Show;
            FindClose(FindFiles);
        end;
    end;
end;


function CreateBackupPage(const AfterID: Integer): TInputDirWizardPage;
begin
   
Result := CreateInputDirPage(AfterID,
              'Резервное копирование',
              'Создание резервных копий перезаписываемых файлов.',
              'Укажите папку, в которую будут помещены резервные копии оригинальных файлов.',
              False, 'Новая папка');
             
    with Result do
    begin
       
Add('Папка резервных копий:');
        Values[0] := AddBackslash(WizardDirValue()) + '{#BAK_DIR}';
    end;
end;


procedure InitializeWizard();
begin
  if
DirExists(AddBackslash(WizardDirValue()) + '{#CUR_DIR}') then
   
pageBackup := CreateBackupPage(6);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall: if DirExists(ExpandConstant('{app}\{#CUR_DIR}')) then
                   
IsBackup(ExpandConstant('{app}\{#CUR_DIR}\'), AddBackslash(pageBackup.Values[0]));
    end;
end;


Ivan_009 03-02-2014 23:54 2302194

Как можно удалить Меню «О программе». Зарание спасибо...

Проще говоря все это меню...

innot20 04-02-2014 00:13 2302197

Цитата:

Цитата Ivan_009
Как можно удалить Меню «О программе». Зарание спасибо...
Проще говоря все это меню... »

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

http://forum.oszone.net/post-1660375-1363.html

PerfectLove 04-02-2014 02:03 2302232

Как сменить цвет текста Caption?

[code]

// backup
Код:

#define A = (Defined UNICODE) ? "W" : "A"


function MoveDir(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFileA@kernel32.dll stdcall';


var
    arrayChk: array of TCheckBox;


function ChkChecked(const Index: Integer): Boolean;
var
    Len: Integer;
begin
    Len := GetArrayLength(arrayChk) - 1;

    if Index > Len then Exit;
    Result := arrayChk[Index].Checked;
end;


procedure CreateBackup();
var
    FindDir: TFindRec;
    i, Len: Integer;
    Dir: array of string;
    MyDir, BackDir: string;
begin
    Len := GetArrayLength(arrayChk) - 1;
    if (ChkChecked(0) and ChkChecked(Len)) then Exit; //Если выбраны оба чекбокса резервная копия создана не будет
    if ChkChecked(0) then Dir := ['*']; //Резервное копирование папки
    if ChkChecked(Len) then Dir := ['xvm']; //Резервное копирование определенных файлов
    MyDir:=ExpandConstant('{app}\res_mods'+'\');
    BackDir:=ExpandConstant('{app}'+'\Backup\');
    for i:=0 to GetArrayLength(Dir)-1 do
    begin
        if FindFirst(MyDir + Dir[i], FindDir) then
        begin
        if FindFirst(MyDir+Dir[i], FindDir) then begin
          repeat
            if not DirExists(BackDir) then begin
              CreateDir(BackDir);
            end;
            MoveDir(MyDir+FindDir.Name, BackDir+FindDir.Name);
          until not FindNext(FindDir);
          FindClose(FindDir);
        end;
      end;
    end;
  end;


procedure CreateChk();
var
    i, Len: Integer;
begin
    SetArrayLength(arrayChk, 2);
    Len := GetArrayLength(arrayChk) - 1;

    for i := 0 to Len do
    begin
        arrayChk[i] := TCheckBox.Create(nil);
        with arrayChk[i] do
        begin
            Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(100 + i*24), ScaleX(400), ScaleY(15));
            Color := clGreen;
            case i of
                0: Caption := 'Backup res_mods folder';
                Len: Caption := 'Backup xvm folder only';
            end;
        end;
    end;
end;


procedure InitializeWizard4();
begin
    CreateChk();
end;



procedure CurStepChanged(CurStep: TSetupStep);
var
    Len: Integer;
begin
    Len := GetArrayLength(arrayChk) - 1;

    case CurStep of
        ssInstall: if (ChkChecked(0) or ChkChecked(Len)) then CreateBackup();
    end;
end


Tco 03 04-02-2014 07:23 2302246

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

diman_21Ru 04-02-2014 10:48 2302333

saurn ,резервную папки модов сохраняет а как сюда добавить значек ?

Nordek 04-02-2014 11:29 2302365

Цитата:

Цитата Ivan_009
удалить Меню «О программе». »

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

[Code]
function AppendMenu(hMenu: HMENU; uFlags, uIDNewItem: UINT; lpNewItem: PChar): BOOL; external 'AppendMenuA@user32.dll stdcall';
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall';

const
 
MF_DELETE    = $200;

procedure InitializeWizard();
begin
  if not
AppendMenu(GetSystemMenu(Wizardform.Handle, True), MF_DELETE, 0, '') then
end
;



Цитата:

Цитата PerfectLove
Как сменить цвет текста »

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

        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(100 + i*24), ScaleX(400), ScaleY(15));
            Color := clRed;
            case i of
               
0: Caption := 'Backup res_mods folder';
                Len: Caption := 'Backup xvm folder only';
            end;
        end;



Цитата:

Цитата Tco 03
сообщений: "Вы действительно хотите удалить программу?" и "Программа была полностью удалена с Вашего копьютера." »

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

[Messages]
UninstallAppFullTitle=Деинсталляция — %1
ConfirmUninstall=Вы действительно хотите удалить %1 и все компоненты программы?
UninstalledAll=Программа %1 была полностью удалена с вашего компьютера.


Ivan_009 04-02-2014 11:33 2302369

Как сменить эту надпись

diman_21Ru 04-02-2014 11:37 2302373

разве не AppName=

Nordek 04-02-2014 11:47 2302383

Цитата:

Цитата Ivan_009
Как сменить эту надпись »

На выбор:
Код:

[Messages]
SetupWindowTitle=Установка — %1

Код:

[Messages]
SetupWindowTitle=Установка — {#AppName}

Код:

[Messages]
SetupWindowTitle=%1

Код:

[Messages]
SetupWindowTitle={#AppName}


Tco 03 04-02-2014 12:50 2302427

Nordek, :no: Ты меня не так понял. Мне нужно через код.
Пример отмены установки:
Код:

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
 Cancel:=False;
 Confirm:=False;
if MsgBox('Вы действительно хотите отменить установку My_Program?', mbError, MB_YESNO) = idYes
 then
  Cancel:=true;
end;


Нужно точно так же, но только с формами: "Вы действительно хотите удалить программу?" и "Программа была полностью удалена с Вашего копьютера." :spiteful:

diman_21Ru 04-02-2014 14:03 2302473

Подскажите пожалуйста вот есть код резервную папку res_mods сохраняет , но как можно добавить значек вот сюда ?
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion;


[code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


procedure IsBackup(const FromDir: String; const ToDir: String);
var
fileArray: array of String;
FindFiles: TFindRec;
i, Len: Integer;
begin
if not DirExists(FromDir) then Exit;
fileArray := ['*'];
Len := GetArrayLength(fileArray) - 1;
for i := 0 to Len do
begin
if FindFirst(FromDir + fileArray[i], FindFiles) then
try
repeat
if not DirExists(ToDir) then CreateDir(ToDir);
MoveFile(FromDir + FindFiles.Name, ToDir + FindFiles.Name);
until not FindNext(FindFiles);
finally

FindClose(FindFiles);
end;
end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: IsBackup(ExpandConstant('{app}\res-mods\'), ExpandConstant('{app}\Backup\'));
end;
end;

Nordek 04-02-2014 15:11 2302531

Цитата:

Цитата diman_21Ru
добавить значек ? »

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

[Files]
Source: icon.ico; Flags: dontcopy solidbreak

[Code]
var
 
IconImage: TNewIconImage;

procedure InitializeWizard();
begin
 
IconImage := TNewIconImage.Create(WizardForm);
  with IconImage do
  begin
   
Parent := WizardForm.SelectDirPage;
    Left := ScaleX(0);    // Положение слева
   
Top := ScaleY(184);  // Положение сверху
   
Width := ScaleX(32);  // Ширина значка
   
Height := ScaleY(32); // Высота значка
   
ExtractTemporaryFile('icon.ico');
    Icon.LoadFromFile(ExpandConstant('{tmp}\icon.ico'));
  end;
end;



diman_21Ru, Твоя очередь когда нибудь придёт - У тебя два варианта: Либо ждать, либо самому делать - а не плодить сообщения.
Цитата:

Цитата diman_21Ru
есть код »

Слышал когда нибудь такое "bbcode"?

Захвати свой код в тег [CODE][/CODE] - здесь написано как это делается, и спрячь под спойлер тегом [MORE][/MORE]. Учись - у тебя есть возможность.

diman_21Ru 04-02-2014 15:15 2302533

Nordek,сори за назойливость крайне срочно нужна кнопка :)

Nordek 04-02-2014 15:29 2302543

diman_21Ru, В коде обрати внимание на Parent := WizardForm.SelectDirPage;
меняешь значения в зависимости от того на какой странице хочешь чтоб отображалось, например:
читать дальше »
Код:

    Parent := WizardForm.SelectDirPage; // На странице выбора папки установки
Код:

    Parent := WizardForm.SelectProgramGroupPage; // На странице выбора папки меню пуск
Код:

Parent := WizardForm.SelectComponentsPage; // На странице компонентов
Код:

Parent := WizardForm.SelectTasksPage; // На странице задач

innot20 04-02-2014 16:43 2302605

Цитата:

Цитата saurn
innot20
читать дальше » »

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

diman_21Ru 04-02-2014 18:24 2302673

Код на резервные копии папки res_mods не работает вместо этого он добавляет шрифты какие то (
использовал код #2113

saurn 04-02-2014 20:28 2302728

Цитата:

Цитата innot20
а возможно ли это вывести при выборе папки установки? »

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

#define CUR_DIR "res-mods"
#define BAK_DIR "old_res-mods"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion;


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
   
backupChk: TCheckBox;


procedure IsBackup(const FromDir: String; const ToDir: String);
var
   
fileArray: array of String;
    FindFiles: TFindRec;
    i, Len: Integer;
begin
   
fileArray := ['*'];
    Len := GetArrayLength(fileArray) - 1;
    for i := 0 to Len do
    begin
        if
FindFirst(FromDir + fileArray[i], FindFiles) then
        try
           
WizardForm.ProgressGauge.Hide;
            WizardForm.StatusLabel.Caption := 'Создание резервной копии файлов...';

            repeat
                if not
DirExists(ToDir) then CreateDir(ToDir);
                  MoveFile(FromDir + FindFiles.Name, ToDir + FindFiles.Name);
            until not FindNext(FindFiles);
        finally

           
WizardForm.ProgressGauge.Show;
            FindClose(FindFiles);
        end;
    end;
end;


procedure InitializeWizard();
var
   
ThereIsFolder: Boolean;
begin
   
backupChk := nil;
    ThereIsFolder := DirExists(AddBackslash(WizardDirValue()) + '{#CUR_DIR}');
   
    if ThereIsFolder then
    begin
       
backupChk := TCheckBox.Create(nil);
        with backupChk do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(WizardForm.DirEdit.Left), ScaleY(WizardForm.DirEdit.Top + 40), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));
            Caption := 'Сохранить резервную копию перезаписываемых файлов';
            Checked := ThereIsFolder;
        end;
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall: if backupChk <> nil then
                    if
backupChk.Checked then
                     
IsBackup(ExpandConstant('{app}\{#CUR_DIR}\'), ExpandConstant('{app}\{#BAK_DIR}\'));
    end;
end;



Цитата:

Цитата diman_21Ru
Код на резервные копии папки res_mods не работает вместо этого он добавляет шрифты какие то (
использовал код #2113 »

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

Цитата:

Цитата diman_21Ru
добавить значек вот сюда ? »

Под спойлером.

sergey3695 04-02-2014 21:12 2302762

При использовании

const
ID_ASTERISK = 65583;
...
Icon.Handle := ID_ASTERISK;

на 7 и 8 все норм. а на xp отображается другая иконка. Если даже сделать проверку на систему, то какое значение должна принимать иконка на xp?

diman_21Ru 04-02-2014 21:12 2302765

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

saurn 04-02-2014 21:48 2302785

Цитата:

Цитата sergey3695
на 7 и 8 все норм. а на xp отображается другая иконка. »

А через LoadIcon?
читать дальше »
Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function LoadIcon(hInstance: UINT; lpIconName: UINT): HICON; external 'LoadIcon{#A}@user32.dll stdcall';


const
   
IDI_APPLICATION = 32512; //Default application icon.
   
IDI_ASTERISK    = 32516; //Asterisk icon. Same as IDI_INFORMATION.
   
IDI_ERROR      = 32513; //Hand-shaped icon.
   
IDI_EXCLAMATION = 32515; //Exclamation point icon. Same as IDI_WARNING.
   
IDI_HAND        = 32513; //Hand-shaped icon. Same as IDI_ERROR.
   
IDI_INFORMATION = 32516; //Asterisk icon.
   
IDI_QUESTION    = 32514; //Question mark icon.
   
IDI_SHIELD      = 32518; //Security Shield icon.
   
IDI_WARNING    = 32515; //Exclamation point icon.
   
IDI_WINLOGO    = 32517; //Default application icon. Windows 2000: Windows logo icon.


procedure InitializeWizard();
begin
   
MsgBoxEx(WizardForm.Handle, 'Test', 'Test', MB_OK, LoadIcon(0, IDI_ASTERISK), 0);
end;


diman_21Ru 04-02-2014 21:56 2302789

А как тут указать путь чтобы папку видел без разделов т.е это для бекапа папки res_mods Source: C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion;

sergey3695 04-02-2014 22:45 2302823

saurn, все норм спасибо. Я не знал как LoadIcon использовать в inno, скорее как прописать функцию.

saurn 04-02-2014 22:53 2302830

Цитата:

Цитата diman_21Ru
C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion; »

Причем здесь папка шрифтов, я же сказал: это для примера.
Source: путь к папке с устанавливаемыми файлами (здесь указываете местоположение файлов, которые будут устанавливатся)
DestDir: папка, в которую будут установленны файлы
Справку читайте.

PerfectLove 05-02-2014 02:37 2302929

Цитата:

Цитата Nordek
Как сменить цвет текста »
« скрыть
Код:
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(100 + i*24), ScaleX(400), ScaleY(15));
Color := clRed;
case i of
0: Caption := 'Backup res_mods folder';
Len: Caption := 'Backup xvm folder only';
end;
end; »

Я так и сам делал, но результата никакого. Текст как был чёрным так и остается.

saurn 05-02-2014 03:07 2302937

Цитата:

Цитата PerfectLove
Я так и сам делал, но результата никакого. Текст как был чёрным так и остается. »

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

[code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveDir(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
   
arrayChk: array of TCheckBox;
    arrayLbl: array of TLabel;


function ChkChecked(const Index: Integer): Boolean;
var
   
Len: Integer;
begin
   
Len := GetArrayLength(arrayChk) - 1;

    if Index > Len then Exit;
    Result := arrayChk[Index].Checked;
end;


procedure CreateBackup();
var
   
FindDir: TFindRec;
    i, Len: Integer;
    Dir: array of string;
    MyDir, BackDir: string;
begin
   
Len := GetArrayLength(arrayChk) - 1;
    if (ChkChecked(0) and ChkChecked(Len)) then Exit; //Если выбраны оба чекбокса резервная копия создана не будет
   
if ChkChecked(0) then Dir := ['*']; //Резервное копирование папки
   
if ChkChecked(Len) then Dir := ['xvm']; //Резервное копирование определенных файлов
   
MyDir:=ExpandConstant('{app}\res_mods'+'\');
    BackDir:=ExpandConstant('{app}'+'\Backup\');
    for i:=0 to GetArrayLength(Dir)-1 do
    begin
        if
FindFirst(MyDir + Dir[i], FindDir) then
        begin
        if
FindFirst(MyDir+Dir[i], FindDir) then begin
          repeat
            if not
DirExists(BackDir) then begin
             
CreateDir(BackDir);
            end;
            MoveDir(MyDir+FindDir.Name, BackDir+FindDir.Name);
          until not FindNext(FindDir);
          FindClose(FindDir);
        end;
      end;
    end;
  end;


procedure CreateCustomControls();
var
   
i, Len: Integer;
begin
   
SetArrayLength(arrayChk, 2);
    Len := GetArrayLength(arrayChk) - 1;

    for i := 0 to Len do
    begin
       
arrayChk[i] := TCheckBox.Create(nil);
        with arrayChk[i] do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(100 + i*24), ScaleX(15), ScaleY(15));
        end;
    end;
   
    SetArrayLength(arrayLbl, 2);
    Len := GetArrayLength(arrayLbl) - 1;

    for i := 0 to Len do
    begin
       
arrayLbl[i] := TLabel.Create(nil);
        with arrayLbl[i] do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(18), ScaleY(101 + i*24), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));
            Font.Color := $008000;
            case i of
               
0: Caption := 'Backup res_mods folder';
                Len: Caption := 'Backup xvm folder only';
            end;
        end;
    end;
end;


procedure InitializeWizard();
begin
   
CreateCustomControls();
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
   
Len: Integer;
begin
   
Len := GetArrayLength(arrayChk) - 1;

    case CurStep of
       
ssInstall: if (ChkChecked(0) or ChkChecked(Len)) then CreateBackup();
    end;
end;


Nordek 05-02-2014 04:00 2302944

Цитата:

Цитата PerfectLove
Я так и сам делал, но результата никакого. »

Ну так и у меня твой скрипт не сработал - вообще ничего невидно.
Нужно вставлять корректный скрипт - который после компиляции на выходе будет работать.
Уметь правильно работать с тегом [code].
Помочь - это одно дело, а переделывать и что-то там искать - это другое - чувствуешь разницу?
Перед тем как выложить, нужно предварительно проверить на работоспособность - без этого никак.
Если вам вопрошающим лень рабочий вариант предоставить, то какого тем кто вам помогает?

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

diman_21Ru 05-02-2014 11:21 2303049

Всем привет помогите пожалуйста с одним вопросом не как не могу сделать backup папки res-mods и вывести галочку в компоненты ниже в скрине указал , зарание спасибо :)

Ivan_009 05-02-2014 14:33 2303237

Как прописать только сколько Требуется места для установки и Занимаемое место после установки.
Зарание спасибо... (Если можно дайте пожалуйста пример)

saurn 05-02-2014 16:07 2303318

Цитата:

Цитата diman_21Ru
Всем привет помогите пожалуйста с одним вопросом не как не могу сделать backup папки res-mods и вывести галочку в компоненты ниже в скрине указал »

Хватит плодить одинаковые посты. Двумя сообщениями выше только написали: прикрепляйте к сообщению скрипт(желательно с минимальным набором файлов), а не скриншот. Или вам чекбокс надо просто на скрине нарисовать?

innot20 05-02-2014 16:58 2303343

вопрос насчёт backup, галочку не выводит
получается надо добавить это:
PHP код:

Source: {app}res_mods*; DestDir: {app}res_mods_oldFlagsexternal overwritereadonly ignoreversion;    CheckIsBackup(const FromDirString; const ToDirString); 

но тогда ругается на const ToDir
если просто
PHP код:

Source: {app}res_mods*; DestDir: {app}res_mods_oldFlagsexternal overwritereadonly ignoreversion;    CheckIsBackup(); 

то тогда пишет ошибку в коде

Invalid prototype for 'IsBackup'
procedure IsBackup(const FromDir: String; const ToDir: String);

Ivan_009 05-02-2014 17:18 2303352

Почему неотображаютя кнопки вперед, назад, отмена... :o

Код:

Код:

procedure InitializeWizard();
begin
with WizardForm do begin
ClientWidth:=ScaleX(600);
ClientHeight:=ScaleY(400);
OuterNotebook.SetBounds(ScaleX(0),ScaleY(0),WizardForm.ClientWidth,WizardForm.ClientHeight);
InnerNotebook.SetBounds(ScaleX(0),ScaleY(0),WizardForm.ClientWidth,WizardForm.ClientHeight);
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
Bevel.Hide;
Center;
end;

with WizardForm.NextButton do begin
Left := ScaleX(380);
Top := ScaleY(365);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.CancelButton do begin
Left := ScaleX(490);
Top := ScaleY(365);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.BackButton do begin
Left := ScaleX(270);
Top := ScaleY(365);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.DirBrowseButton do begin
Left := ScaleX(465);
Top := ScaleY(200);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.GroupBrowseButton do begin
Left := ScaleX(465);
Top := ScaleY(200);
Width := ScaleX(90);
Height := ScaleY(23);
end;
end;


saurn 05-02-2014 18:04 2303384

Цитата:

Цитата innot20
получается надо добавить это:»

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

#define CUR_DIR "res-mods" ;Папка, которую нужно бэкапить.
#define BAK_DIR "old_res-mods" ;Папка, в которую помещается бэкап

Цитата:

Цитата innot20
Source: {app}res_mods*; DestDir: {app}res_mods_old; Flags: external overwritereadonly ignoreversion; Check: IsBackup(); »

Вы видели в моем примере чековую функцию? Нет. IsBackup(...) не результатирующая функция, а процедура, вызываемая на этапе перед установкой.
Цитата:

Цитата innot20
галочку не выводит »

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

Цитата:

Цитата Ivan_009
Почему неотображаютя кнопки вперед, назад, отмена... »

Потому что вы перекрыли их ноутбуками. Переместите кнопки на передний план.
Код:

with WizardForm.CancelButton do begin
    BringToFront;
end;


Nordek 05-02-2014 18:34 2303399

Цитата:

Цитата diman_21Ru
ниже в скрине указал »

Вот так. Ну как, всё понял как делать?

diman_21Ru, Собственно как и обещал.

diman_21Ru 05-02-2014 18:35 2303400

Nordek , да мне так надо , можешь скинуть код ? зарание спасибо :)

Nordek 05-02-2014 18:45 2303412

Цитата:

Цитата diman_21Ru
да мне так надо , можешь скинуть код ? »

Я тебе уже ответ дал, точно так же как и ты нам.

Хорошо, подчеркну:
Цитата:

Цитата Nordek
Да, здесь ещё есть и особенные типажи, которые любят поскринить - скриншот с ошибкой и больше ничего.
Код тоже между прочим необходимо к скриншоту прилагать. »

Я всё понимаю что вам новичкам не хочется свой код показывать всему интернету - дабы чтобы никто не повторил и не использовал этот код кроме вас.
Знаете ли вы, то что вы спрашиваете здесь - здесь и остаётся. Все ответы которые вам предоставили - можно собрать и сделать уникальный скрипт без ошибок, а не как вы с кучей камней и дублями на тысячу строк. Затем готовый скрипт который будет лучше вашего как минимум в те же тысячу раз - выложить в интернет (поделиться со всем миром)
Чтоб никто не украл, нужно самим всё делать. Чтоб никто не повторил, нужно быть элитным кодером (которые здесь действительно есть) а не горе-репакером.

Ivan_009 05-02-2014 19:54 2303481

saurn, А если я буду накладывать лэйблы и бэвелы мне все время надо указывать BringToFront; или нет... :not-me:

saurn 05-02-2014 20:18 2303493

Цитата:

Цитата Ivan_009
А если я буду накладывать лэйблы и бэвелы мне все время надо указывать BringToFront; или нет... »

С бевелами ситуация иная, на них BringToFront здесь не работает. Но вы же будете создавать их на конкретных страницах, так что этот параметр и не нужен.
А чтоб не плодить BringToFront, достаточно поместить ноутбуки на задний план:
Код:

procedure InitializeWizard();
begin
    with WizardForm do
    begin
        OuterNotebook.SendToBack;
        InnerNotebook.SendToBack;
    end;
end;


saurn 05-02-2014 21:08 2303526

Цитата:

Цитата Ivan_009
Как прописать только сколько Требуется места для установки и Занимаемое место после установки.
Зарание спасибо... (Если можно дайте пожалуйста пример) »

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

Выдернул из скрипта. Думаю разберетесь)
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=...
DisableWelcomePage=yes


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}; Flags: external overwritereadonly ignoreversion; ExternalSize: 50000000000;


[CustomMessages]
MESSAGE_23=Требуется места на диске:
MESSAGE_24=Доступно места на диске:
MESSAGE_25=Файловая система:
MESSAGE_26=МБ
MESSAGE_27=ГБ
MESSAGE_28=ТБ


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


const
   
MAX_PATH                = 260;
    TARGET_FILE_SYSTEM      = 'NTFS';


function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD;
  var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL;
    external 'GetVolumeInformation{#A}@kernel32.dll stdcall';


var
   
MinorInfoLabels, MainInfoLabels: array of TNewStaticText;
   


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


function GetFloatFromText(const UndefText: String): String;
var
   
i, Len: Integer;
begin
   
Len := Length(UndefText);

    for i := 1 to Len do
    case
UndefText[i] of
       
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9': Result := Result + UndefText[i];
        ',': Result := Result + '.';
    end;
end;


function NumToStr(const Float: Extended): String;
var
   
Len: Integer;
begin
   
Result := Format('%.2n', [Float]);
    StringChange(Result, ',', '.');
    Len := Length(Result);

    while ((Result[Len] = '0') or (Result[Len] = '.')) and (Pos('.', Result) > 0) do
        begin
           
Delete(Result, Len, 1);
            Len := Length(Result);
        end;
end;


function UnitDriveSpace(const Float: Extended): String;
begin
    if
(Float < 1024) then Result := NumToStr(Float) + #32 + CustomMessage('MESSAGE_26')
    else if (Float/1024 < 1024) then Result := NumToStr(Float/1024) + #32 + CustomMessage('MESSAGE_27')
    else Result := NumToStr(Float/(1024*1024)) + #32 + CustomMessage('MESSAGE_28');
end;


function CompareDriveRequirements(const FromText: String; const Input: String): Boolean;
var
   
Len: Integer;
    CompareSpace, CompareFileSystem: Boolean;
    UndefNeedSize, UndefFreeSize: Extended;
    VolumeName, FileSystemName, DriveLetter: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
begin
   
Len := GetArrayLength(MainInfoLabels) - 1;

    UndefNeedSize := StrToFloat(GetFloatFromText(FromText));
    UndefFreeSize := Extended(GetFreeDriveSpace(Input));
    VolumeName := StringOfChar(#32, MAX_PATH);
    FileSystemName := StringOfChar(#32, MAX_PATH);
    DriveLetter := AddBackslash(ExtractFileDrive(Input));

    GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);

    MainInfoLabels[0].Caption := UnitDriveSpace(UndefNeedSize);
    MainInfoLabels[1].Caption := UnitDriveSpace(UndefFreeSize);
    MainInfoLabels[Len].Caption := Trim(FileSystemName);

    CompareSpace := (UndefFreeSize > UndefNeedSize);

    case CompareSpace of
       
True: MainInfoLabels[1].Font.Color := clBlack;
        False: MainInfoLabels[1].Font.Color := clRed;
    end;

    CompareFileSystem := (Trim(FileSystemName) >= TARGET_FILE_SYSTEM);

    case CompareFileSystem of
       
True: MainInfoLabels[Len].Font.Color := clBlack;
        False: MainInfoLabels[Len].Font.Color := clRed;
    end;

    Result := (CompareSpace and CompareFileSystem);
    WizardForm.NextButton.Enabled := Result;
end;


procedure WizardEditsOnChange(Sender: TObject);
begin
    case
TEdit(Sender) of
       
WizardForm.DirEdit: CompareDriveRequirements(WizardForm.DiskSpaceLabel.Caption, WizardDirValue());
    end;
end;


procedure CreateCustomControls();
var
   
i, Len: Integer;
    InfoBox: TNewGroupBox;
begin
    with
WizardForm do
    begin
       
InfoBox := TNewGroupBox.Create(SelectDirPage);
        with InfoBox do
        begin
           
Parent := SelectDirPage;
            SetBounds(ScaleX(12), ScaleY(120), ScaleX(450), ScaleY(86));

            SetArrayLength(MinorInfoLabels, 3);
            Len := GetArrayLength(MinorInfoLabels) - 1;

            for i := 0 to Len do
            begin
               
MinorInfoLabels[i] := TNewStaticText.Create(InfoBox);
                with MinorInfoLabels[i] do
                begin
                   
Parent := InfoBox;
                    SetBounds(ScaleX(16), ScaleY(13 + i*23), ScaleX(138), ScaleY(14));
                    AutoSize := False;

                    case i of
                       
0: Caption := CustomMessage('MESSAGE_23');
                        1: Caption := CustomMessage('MESSAGE_24');
                        Len: Caption := CustomMessage('MESSAGE_25');
                    end;
                end;
            end;

            SetArrayLength(MainInfoLabels, 3);
            Len := GetArrayLength(MainInfoLabels) - 1;

            for i := 0 to Len do
            begin
               
MainInfoLabels[i] := TNewStaticText.Create(InfoBox);
                with MainInfoLabels[i] do
                begin
                   
Parent := InfoBox;
                    SetBounds(ScaleX(165), ScaleY(13 + i*23), ScaleX(268), ScaleY(14));
                    AutoSize := False;
                end;
            end;
        end;
    end;
end;


procedure ModifyWizardForm();
begin
    with
WizardForm do
    begin
       
ClientWidth := ScaleX(498);
        ClientHeight := ScaleY(354);
        BorderStyle := bsDialog;
        Position := poScreenCenter;

        OuterNotebook.SetBounds(ScaleX(0), ScaleY(0), ScaleX(498), ScaleY(302));
        InnerNotebook.SetBounds(ScaleX(12), ScaleY(62), ScaleX(474), ScaleY(238));
        MainPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(498), ScaleY(60));
        Bevel1.SetBounds(ScaleX(0), ScaleY(60), ScaleX(498), ScaleY(3));
        BeveledLabel.Top := ScaleY(294);
        BackButton.SetBounds(ScaleX(252), ScaleY(318), ScaleX(75), ScaleY(23));
        NextButton.SetBounds(ScaleX(327), ScaleY(318), ScaleX(75), ScaleY(23));
        CancelButton.SetBounds(ScaleX(412), ScaleY(318), ScaleX(75), ScaleY(23));
        PageNameLabel.SetBounds(ScaleX(16), ScaleY(10), ScaleX(324), ScaleY(14));
        PageDescriptionLabel.SetBounds(ScaleX(24), ScaleY(26), ScaleX(316), ScaleY(28));
        SelectDirLabel.SetBounds(ScaleX(68), ScaleY(9), ScaleX(262), ScaleY(14));
        SelectDirBitmapImage.Left := ScaleX(12);
        SelectDirBrowseLabel.Left := ScaleX(12);

        with DirEdit do
        begin
           
Left := ScaleX(12);
            Width := ScaleX(370);
            OnChange := @WizardEditsOnChange;
        end;
       
        DirBrowseButton.Left := ScaleX(387);
        DiskSpaceLabel.Hide;
    end;
end;


procedure InitializeWizard();
begin
   
ModifyWizardForm();
    CreateCustomControls();
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
CurPageID of
       
wpSelectDir: WizardEditsOnChange(WizardForm.DirEdit);
    end;
end;


diman_21Ru 05-02-2014 22:23 2303585

Хоть убейся но в скрипт backup папки res-mods и галочку в компоненты я не как добавить не могу =(
Если все же кто то может добавить мне это в скрипт я скину в личку только скажите :)

Nordek 06-02-2014 00:33 2303692

Цитата:

Цитата diman_21Ru
Хоть убейся но в скрипт backup папки res-mods и галочку в компоненты я не как добавить не могу =( »

Не верю. Знаешь в чём твоя беда? В том что ты невнимателен, не хочешь учиться и ленивый - даже для себя самого, поверь, я знаю о чём пишу.
С лёгкостью это наглядно покажу: Сообщение 1751, Сообщение 2116 - кому это всё пишется?

Показываю на примере этого кода который предоставил saurn:
читать дальше »
Подчеркнул красным

Код:

procedure CreateCustomControls();
var
   
i, Len: Integer;
begin
   
SetArrayLength(arrayChk, 2);
    Len := GetArrayLength(arrayChk) - 1;

    for i := 0 to Len do
    begin
       
arrayChk[i] := TCheckBox.Create(nil);
        with arrayChk[i] do
        begin

            Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(100 + i*24), ScaleX(15), ScaleY(15));

        end;
    end;

    SetArrayLength(arrayLbl, 2);
    Len := GetArrayLength(arrayLbl) - 1;

    for i := 0 to Len do
    begin
       
arrayLbl[i] := TLabel.Create(nil);
        with arrayLbl[i] do
        begin

            Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(18), ScaleY(101 + i*24), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));

            Font.Color := $008000;
            case i of
               
0: Caption := 'Backup res_mods folder';
                Len: Caption := 'Backup xvm folder only';
            end;
        end;
    end;
end;


Код:

procedure CreateCustomControls();
var
   
i, Len: Integer;
begin
   
SetArrayLength(arrayChk, 2);
    Len := GetArrayLength(arrayChk) - 1;

    for i := 0 to Len do
    begin
       
arrayChk[i] := TCheckBox.Create(nil);
        with arrayChk[i] do
        begin

            Parent := WizardForm.SelectComponentsPage;
            SetBounds(ScaleX(0), ScaleY(180 + i*24), ScaleX(15), ScaleY(15));

        end;
    end;

    SetArrayLength(arrayLbl, 2);
    Len := GetArrayLength(arrayLbl) - 1;

    for i := 0 to Len do
    begin
       
arrayLbl[i] := TLabel.Create(nil);
        with arrayLbl[i] do
        begin

            Parent := WizardForm.SelectComponentsPage;
            SetBounds(ScaleX(18), ScaleY(181 + i*24), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));

            Font.Color := $008000;
            case i of
               
0: Caption := 'Backup res_mods folder';
                Len: Caption := 'Backup xvm folder only';
            end;
        end;
    end;
end;


habib2302 06-02-2014 10:09 2303840

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

и после соглашения появляется маленькое окно процесса установки

diman_21Ru 06-02-2014 19:16 2304224

Source: {app}res_mods*; DestDir: {app}res_mods_old; Flags: external overwritereadonly ignoreversion; выходит ошибка пи установке модов !

Shkutu 06-02-2014 19:21 2304231

Приветствую!
Подскажите плиз, как можно изменять текст стандартных сообщений в коде (не через секцию Messages)? Нужно на InstallingPage менять текст в зависимости от различных условий

saurn 06-02-2014 19:50 2304245

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

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
OutputDir=...
BitmapResource=bitmap:compiler:WizModernSmallImage.bmp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[code]
#define A = (Defined UNICODE) ? "W" : "A"


const
   
MB_ICONNONE          = $00000000;
    MB_ICONSTOP          = $00000010;
    MB_ICONEXCLAMATION  = $00000030;
    MB_ICONASTERISK      = $00000040;

    MB_CANCELTRYCONTINUE = $00000006;

    MB_APPLMODAL        = $00000000;
    MB_SYSTEMMODAL      = $00001000;
    MB_TASKMODAL        = $00002000;

    MB_RIGHT            = $00080000;

    IDTRYAGAIN          = 10;
    IDCONTINUE          = 11;

    BM_CLICK = $00F5;

    WM_USER              = $0400;
    PBM_SETPOS          = WM_USER + 2;
    GWL_WNDPROC          = - 4;


type
   
LPCTSTR = String;
    _HINSTANCE = LongWord;

    LPARAM = Integer;
    WPARAM = Integer;
    LRESULT = Integer;
    TFNWndProc = Integer;


function MessageBox(HWND: hWnd; lpText: LPCTSTR; lpCaption: LPCTSTR; uType: UINT): Integer; external 'MessageBox{#A}@user32.dll stdcall';
function LoadBitmap(hInstance: _HINSTANCE; lpBitmapName: LPCTSTR): HBITMAP; external 'LoadBitmap{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: LPCTSTR): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';


var
   
swInitialize: Boolean;
    OldProgressBarProc: Longint;


function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
    if
Msg = PBM_SETPOS then with WizardForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (ProgressGauge.Position*100)/ProgressGauge.Max)]) );

    Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;


function InitializeSetup(): Boolean;
begin
   
Result := MessageBox(Application.Handle, 'Продолжить установку?', 'Подтверждение установки', MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON1 or MB_APPLMODAL) = 6;
    swInitialize := Result;
end;


procedure InitializeWizard();
begin
    with
WizardForm do
    begin
       
ClientHeight := ScaleY(97);
        BorderStyle := bsDialog;
        Position := poScreenCenter;

        InnerNotebook.SetBounds(ScaleX(0), ScaleY(0), ScaleX(497), ScaleY(97));
        MainPanel.Hide;
        WizardSmallBitmapImage.Hide;
        PageDescriptionLabel.Hide;
        PageNameLabel.Hide;
        FilenameLabel.Hide;

        with StatusLabel do
        begin
           
Left := ScaleX(64);
            Top := ScaleY(24);
        end;

        ProgressGauge.Left := ScaleX(64);

        with TBitmapImage.Create(nil) do
        begin
           
Parent := WizardForm.InstallingPage;
            SetBounds(ScaleX(8), ScaleY(24), ScaleX(48), ScaleY(48));
            Bitmap.Handle := LoadBitmap(HInstance, '_IS_BITMAP');
        end;
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
   
PostMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall: OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
        ssPostInstall: SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
        ssDone: MessageBox(WizardForm.Handle, 'Установка завершена', 'Завершение установки', MB_OK or MB_ICONASTERISK or MB_DEFBUTTON1 or MB_APPLMODAL)
    end;
end;


procedure DeinitializeSetup();
begin
    if
swInitialize then SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;


UPD: поправил пример

Цитата:

Цитата Shkutu
Подскажите плиз, как можно изменять текст стандартных сообщений в коде (не через секцию Messages)? Нужно на InstallingPage менять текст в зависимости от различных условий »

Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
    case CurStep of
        ssInstall: if...условие... then WizardForm.StatusLabel.Caption :=
    end;
end;

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

Цитата:

Цитата diman_21Ru
Source: {app}res_mods*; DestDir: {app}res_mods_old; Flags: external overwritereadonly ignoreversion; выходит ошибка пи установке модов ! »

Потому что секция файлов тут - одна сплошная ошибка. Устал пояснять, но все же повторю, сжато:
Код:

Source: Папка, где находятся устанавливаемые файлы\*; DestDir: папка, куда файлы устанавливаются; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;

diman_21Ru, может, почитаете наконец справку?

Nordek 06-02-2014 21:02 2304293

Цитата:

Цитата diman_21Ru
Source: {app}res_mods*; DestDir: {app}res_mods_old »

Первое на что обрати внимание, это слешь \
Код:

Source: {app}\res_mods\*; DestDir: {app}\res_mods_old; Flags: ignoreversion overwritereadonly createallsubdirs recursesubdirs;
нет флагов
Код:

recursesubdirs  - Обрабатывать подкаталоги
createallsubdirs - Создавать все подкаталоги

так же присутствует флаг
Код:

external - Внешний источник (это значит что если флаг external присутствует, то файлы и папки в инсталлятор не войдут. Будут браться из рядом лежащей папке который указан в инсталляторе).
Цитата:

Цитата diman_21Ru
Source: {app}res_mods* »

И что за {app} вначале, который в Source? У тебя есть этот каталог?

diman_21Ru 06-02-2014 23:35 2304422

Как можно в этом скрипте почистить и убрать все чтобы могли появится Компоненты
http://rghost.ru/52251071

Shkutu 07-02-2014 01:03 2304495

saurn, спасибо. А не подскажете, какой компонент надо использовать, чтобы также поменять тот текст, что расположен над StatusLabel?

saurn 07-02-2014 01:54 2304505

Цитата:

Цитата Shkutu
какой компонент надо использовать, чтобы также поменять тот текст, что расположен над StatusLabel? »

В шапке формы?
Код:

WizardForm.PageNameLabel.Caption := ''; //заголовок
WizardForm.PageDescriptionLabel.Caption := ''; //подзаголовок

Эти контролы одни для всех страниц, и их значения меняются в зависимости от текущей страницы мастера.

Debugger 07-02-2014 06:30 2304526

Планирую сделать перепаковку плагина к Photoshop. Плагин идет в двух вариантах - 32 и 64 бит. Хочу чтобы во время инсталляции скрипт определял битность операционной системы и в зависимости от этого в окне выбора компонентов предлагал либо на выбор оба варианта установки, в случае 64-битной ОС, либо в случае 32-битной, либо вообще не предлагал бы выбор либо галочка 32 бита была бы недоступна. Вопрос - возможно ли сделать это без необходимости писать большой и нудный код в секции [code]? И какой инсталлятор в этоп плане гибче - Inno Setup или NSIS?

Gnom_aka_Lexander 07-02-2014 07:22 2304532

Debugger, Check: IsWin64 для 64 и Check: not IsWin64 для х32. по сути является булевой функцией, что позволяет использовать ее во всех секциях, в тех местах, где требуется ответ в виде да-нет на вопрос - Система х64?
Пример использования Check из справки:

читать дальше »
Существует один необязательный параметр, поддерживаемый всеми секциями, содержащие параметры. Это:
Check
Имя проверочной функции, которая определяет, должен быть применен параметр или нет. Эта функция должна быть либо описана в секции [Сode], либо быть встроенной функцией.

Кроме простого имени можно использовать логические выражения. Для справки обратитесь к разделу Параметры секций [Components] и [Tasks].

Для каждой check-функции можно добавить список параметров, разделенных запятыми, которые инсталлятор должен предоставить check-функции. Допустимые типы параметров: строковый (String), целочисленный (Integer) и логический (Boolean). Строковые параметры могут содержать константы. These constants will not be automatically expanded. If you want to pass an expanded constant, существует одна встроенная функция, которую можно добавлять в список параметров: это ExpandConstant.

Например:
Код:

[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: MyProgCheckSource: "A\MYFILE.TXT"; DestDir: "{app}"; Check: MyDirCheck(ExpandConstant('{app}\A'))
Source: "B\MYFILE.TXT"; DestDir: "{app}"; Check: DirExists(ExpandConstant('{app}\B'))

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

Инсталлятор может вызывать каждую check-функцию по нескольку раз, даже если только одно значение использует эту check-функцию. Если ваша функция выполняет длинный сегмент кода, можно оптимизировать его - выполнив его однажды, можно присвоить полученное значение глобальной переменной.

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

Пример секции [Сode], содержащей проверочные функции (check-функции). Функция DirExists является DirExists встроенной функцией, поэтому не описана в секции [Сode].
Код:

[Сode]
var
  MyProgChecked: Boolean;
  MyProgCheckResult: Boolean;

function MyProgCheck(): Boolean;
begin
  if not MyProgChecked then
  begin
    MyProgCheckResult := MsgBox('Do you want to install MyProg.exe to ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = idYes;    MyProgChecked := True;
  end;
  Result := MyProgCheckResult;
end;

function MyDirCheck(DirName: String): Boolean;
begin
  Result := DirExists(DirName);
end;


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

Ivan_009 07-02-2014 10:07 2304611

Как добавить сглаживание шрифта через код как сдесь, чтобы на всех системах было одинаковое отображение или это фотошоп не пойму... :dont-know

Подскажите пожалуйста...

P.S : Проверял на Windows 7 и Windows XP отображается одинаково...

diman_21Ru 07-02-2014 11:35 2304683

Как Объединить скрипт с файлом bin в один

habib2302 07-02-2014 11:40 2304687

saurn,
а можно с .png'ешной картинкой через ботву

Ivan_009 07-02-2014 11:42 2304690

Цитата:

Цитата diman_21Ru
Как Объединить скрипт с файлом bin в один »

Используй для этих целей IsDone. И справочку незабудь почитать... :read:

saurn 07-02-2014 12:28 2304723

Вложений: 1
Цитата:

Цитата habib2302
а можно с .png'ешной картинкой через ботву »

Архив с примером во вложении.

Цитата:

Цитата diman_21Ru
Как Объединить скрипт с файлом bin в один »

Удалить из секции [Setup] директиву DiskSpanning, или задать ей значение no

The_Immortal 07-02-2014 13:49 2304765

Друзья, подскажите, пожалуйста, как можно в скрипте реализовать следующее в режиме verysilent:

если разрядность ОСи x86, то отменяем установку и в КОНСОЛЬ возвращаем какое-либо сообщение с кодом.


Пример того, что я хочу увидеть при запуске собранного инсталлятора Inno из-под CMD на 86-разрядной ОС:
Код:

C:\Users\The_Immortal>program.exe
Unsupported OS (x86)

C:\Users\The_Immortal>


diman_21Ru 07-02-2014 16:10 2304880

Как можно растянуть окно для текста компонентов на весь экран ?
Искал искал не как не нашел где именно менять ,помогите пожалуйста

Ivan_009 07-02-2014 20:18 2305063

Как добавить в начале скрипта проверку на Расширенную версию Inno Setup Compiler...

Iska 07-02-2014 20:24 2305068

Цитата:

Цитата The_Immortal
и в КОНСОЛЬ »

А без консоли? Лог-файл никак не устраивает? Ибо InnoSetup создаёт GUI-инсталляцию, и для консоли как минимум нужны лишние телодвижения.

Nordek 07-02-2014 20:52 2305095

Цитата:

Цитата diman_21Ru
Как можно растянуть окно для текста компонентов на весь экран ? »

Как-то не особо понятно.

Регулируй по своему InnerNotebook, OuterNotebook и остальные по необходимости

InnerNotebook
Код:

  with WizardForm.InnerNotebook do
  begin

    Left := ScaleX(XXX);
    Top := ScaleY(XXX);
    Width := ScaleX(XXX);
    Height := ScaleY(XXX);
  end;

OuterNotebook
Код:

  with WizardForm.OuterNotebook do
  begin

    Left := ScaleX(XXX);
    Top := ScaleY(XXX);
    Width := ScaleX(XXX);
    Height := ScaleY(XXX);
  end;


Необработанный пример большого инсталлятора

Код:

[Code]
procedure InitializeWizard();
begin
  with
WizardForm do
  begin
   
AutoScroll := False;
    ClientHeight := ScaleY(550);
    ClientWidth := ScaleX(709);
  end;

  with WizardForm.Bevel do
  begin
   
Top := ScaleY(505);
    Width := ScaleX(710);
  end;

  with WizardForm.CancelButton do
  begin
   
Left := ScaleX(172);
    Top := ScaleY(519);
  end;

  with WizardForm.NextButton do
  begin
   
Left := ScaleX(92);
    Top := ScaleY(519);
  end;

  with WizardForm.BackButton do
  begin
   
Left := ScaleX(12);
    Top := ScaleY(519);
  end;

  with WizardForm.OuterNotebook do
  begin
   
Width := ScaleX(710);
    Height := ScaleY(505);
  end;

  with WizardForm.WizardBitmapImage do
  begin
   
Width := ScaleX(212);
    Height := ScaleY(506);
  end;

  with WizardForm.WelcomeLabel2 do
  begin
   
Left := ScaleX(240);
    Width := ScaleX(445);
    Height := ScaleY(415);
  end;

  with WizardForm.WelcomeLabel1 do
  begin
   
Left := ScaleX(240);
    Width := ScaleX(445);
  end;

  with WizardForm.Bevel1 do
  begin
   
Width := ScaleX(710);
  end;

  with WizardForm.InnerNotebook do
  begin
   
Left := ScaleX(8);
    Top := ScaleY(64);
    Width := ScaleX(697);
    Height := ScaleY(437);
  end;

  with WizardForm.LicenseNotAcceptedRadio do
  begin
   
Top := ScaleY(408);
  end;

  with WizardForm.LicenseAcceptedRadio do
  begin
   
Top := ScaleY(388);
  end;

  with WizardForm.LicenseMemo do
  begin
   
Width := ScaleX(697);
    Height := ScaleY(340);
  end;

  with WizardForm.LicenseLabel1 do
  begin
   
Width := ScaleX(697);
  end;

  with WizardForm.InfoBeforeMemo do
  begin
   
Width := ScaleX(697);
    Height := ScaleY(405);
  end;

  with WizardForm.DiskSpaceLabel do
  begin
   
Top := ScaleY(416);
  end;

  with WizardForm.DirBrowseButton do
  begin
   
Left := ScaleX(614);
  end;

  with WizardForm.DirEdit do
  begin
   
Width := ScaleX(604);
  end;

  with WizardForm.ComponentsDiskSpaceLabel do
  begin
   
Top := ScaleY(416);
  end;

  with WizardForm.ComponentsList do
  begin
   
Width := ScaleX(697);
    Height := ScaleY(344);
  end;

  with WizardForm.TypesCombo do
  begin
   
Width := ScaleX(697);
  end;

  with WizardForm.SelectComponentsLabel do
  begin
   
Width := ScaleX(681);
  end;

  with WizardForm.NoIconsCheck do
  begin
   
Top := ScaleY(415);
  end;

  with WizardForm.GroupBrowseButton do
  begin
   
Left := ScaleX(614);
  end;

  with WizardForm.GroupEdit do
  begin
   
Width := ScaleX(604);
  end;

  with WizardForm.TasksList do
  begin
   
Width := ScaleX(697);
    Height := ScaleY(400);
  end;

  with WizardForm.ReadyMemo do
  begin
   
Width := ScaleX(697);
    Height := ScaleY(413);
  end;

  with WizardForm.PreparingLabel do
  begin
   
Width := ScaleX(673);
    Height := ScaleY(113);
  end;

  with WizardForm.PreparingMemo do
  begin
   
Top := ScaleY(168);
    Width := ScaleX(649);
    Height := ScaleY(249);
  end;

  with WizardForm.ProgressGauge do
  begin
   
Width := ScaleX(697);
  end;

  with WizardForm.InfoAfterMemo do
  begin
   
Width := ScaleX(697);
    Height := ScaleY(405);
  end;

  with WizardForm.MainPanel do
  begin
   
Width := ScaleX(710);
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
   
Left := ScaleX(656);
    Top := ScaleY(0);
  end;

  with WizardForm.WizardBitmapImage2 do
  begin
   
Width := ScaleX(212);
    Height := ScaleY(506);
  end;

  with WizardForm.RunList do
  begin
   
Left := ScaleX(240);
  end;

  with WizardForm.NoRadio do
  begin
   
Left := ScaleX(240);
  end;

  with WizardForm.YesRadio do
  begin
   
Left := ScaleX(240);
  end;

  with WizardForm.FinishedLabel do
  begin
   
Left := ScaleX(240);
    Width := ScaleX(445);
  end;

  with WizardForm.FinishedHeadingLabel do
  begin
   
Left := ScaleX(240);
    Width := ScaleX(445);
  end;
end;


diman_21Ru 07-02-2014 21:04 2305102

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

vint56 08-02-2014 00:28 2305210

diman_21Ru
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
DisableWelcomepage=yes
DisableDirPage=yes


[Components]
;Name: "EM_WP_Lite"; Description: "ExpromtMax WOT Pack lite"; Flags: Fixed;
Name: "NDXVMC"; Description: "XVM Config New Death от ExpromtMax";
Name: "NDXVMC\XPBarWide"; Description: "New Death Config с широкой полосой остатка XP"; Flags: exclusive; Types: full;
Name: "NDXVMC\XPBarNarrow"; Description: "New Death Config с узкой полосой остатка XP"; Flags: exclusive;
Name: "NDXVMC\LSS"; Description: "Лампочки Шестого чувства";
Name: "NDXVMC\LSS\EM"; Description: "Лампочка -NEW DEATH- (EXPROMT_MAX)"; Flags: exclusive; Types: full;
Name: "NDXVMC\LSS\WL"; Description: "Белая лампочка"; Flags: exclusive;
Name: "NDXVMC\LSS\WD"; Description: "Внимание, опасность!"; Flags: exclusive;
Name: "NDXVMC\LSS\SN"; Description: "Sukanoob"; Flags: exclusive;
Name: "NDXVMC\LSS\TF"; Description: "Танк обнаружен"; Flags: exclusive;
Name: "NDXVMC\LSS\EOS"; Description: "Око Саурона"; Flags: exclusive;
Name: "NDXVMC\SLSS"; Description: "Звук лампы шестого чувства";
Name: "NDXVMC\SLSS\EMM"; Description: "EXPROMT_MAX+Alhor с таймером"; Flags: exclusive; Types: full;
Name: "NDXVMC\SLSS\ALas"; Description: "Alastanka с таймером"; Flags: exclusive;
Name: "NDXVMC\SLSS\SAu"; Description: "Саурон"; Flags: exclusive;
Name: "NDXVMC\SLSS\HisF"; Description: "Истеричный FUCK"; Flags: exclusive;
Name: "NDXVMC\SLSS\Kat"; Description: "Катюша"; Flags: exclusive;
Name: "SIGHTS"; Description: "прицелы";
Name: "SIGHTS\SOD"; Description: "Прицел Дамоклов меч AleksLee (EXPROMT_MAX)"; Flags: exclusive; Types: full;
Name: "SIGHTS\TD"; Description: "Прицел TAIPAN - DIKEY93"; Flags: exclusive;
Name: "SIGHTS\MOT"; Description: "Космический прицел M_O_T clan"; Flags: exclusive;
Name: "SIGHTS\Jim"; Description: "Прицел Jimb0"; Flags: exclusive;
Name: "UGN"; Description: "Углы горизонтальной наводки";
Name: "UGN\SEM"; Description: "Shtys (EXPROMT_MAX)"; Flags: exclusive; Types: full;
Name: "UGN\AOD"; Description: "AleksLee дамоклов меч"; Flags: exclusive;
Name: "DP"; Description: "Дамаг Панели";
Name: "DP\GEM"; Description: "Дамаг-панель GambitER. (EXPROMT_MAX)"; Flags: exclusive; Types: full;
Name: "DP\BN"; Description: "Дамаг-панель BioNick"; Flags: exclusive;
;Name: "DP\Dell"; Description: "Дамаг-панель Dellux"; Flags: exclusive;
;Name: "DP\Zayaz"; Description: "Дамаг панель Zayaz"; Flags: exclusive;
;Name: "TI"; Description: "Иконки танков (уши)";
;Name: "TI\EM"; Description: "Иконки EXPROMT_MAX"; Flags: exclusive; Types: full;
;Name: "TI\3D"; Description: "3D иконки Romkyns"; Flags: exclusive;
;Name: "TI\ser"; Description: "Иконки seriych"; Flags: exclusive;
;Name: "TI\Mstr"; Description: "Иконки Master_XH"; Flags: exclusive;
;Name: "PIG"; Description: "Панели-часы в бою, в ангаре, пинг, фпс от marsoff (EXPROMT_MAX)"; Types: full;
;Name: "PIG\Clock"; Description: "Часы в бою и время боя";
;Name: "PIG\PFPS"; Description: "Панель пинг и фпс";
;Name: "HDMap"; Description: "HD мини-карты locastan";
;Name: "CHTIcons"; Description: "Чат-иконки и цветные сообщения iRamSoft (EXPROMT_MAX)"; Types: full;
;Name: "RZDPlat"; Description: "Яркие жд платформы locastan";
;Name: "WSkins"; Description: "Белые шкурки пробитий Nooben";
;Name: "MFPet"; Description: "Маркер Фокус PetR0vich81 (EXPROMT_MAX)"; Types: full;
;Name: "INO"; Description: "Индикатор направления огня";
;Name: "INO\GW"; Description: "GreenWarriors (EXPROMT_MAX)"; Flags: exclusive; Types: full;
;Name: "INO\PV"; Description: "poVitter"; Flags: exclusive;
;Name: "INO\Mars"; Description: "marsoff"; Flags: exclusive;
;Name: "InfP"; Description: "Инфо-панель цели Shtys (удалится время перезаряда в прицеле)";
;Name: "InfP\Srd"; Description: "Стандарт"; Flags: exclusive;
;Name: "InfP\Col"; Description: "Цветная"; Flags: exclusive;
;Name: "Chat"; Description: "Настройка элементов чата в бою"
;Name: "Chat\Hist"; Description: "История сообщений-STL1te"; Flags: exclusive;
;Name: "Chat\PCht"; Description: "Прозрачный чат в бою-beta"; Flags: exclusive;
;Name: "KSnD"; Description: "Крупно количество снарядов в панели, в бою-Zayaz (EXPROMT_MAX)"; Types: full;


[code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
procedure InitializeWizard();
begin
with WizardForm do
begin
ClientHeight := ScaleY(560);
end;
with WizardForm.CancelButton do
begin
Top := ScaleY(519);
Height := ScaleY(31);
end;

with WizardForm.NextButton do
begin
Left := ScaleX(93);
Top := ScaleY(519);
Height := ScaleY(31);
end;

with WizardForm.BackButton do
begin
Left := ScaleX(13);
Top := ScaleY(519);
Height := ScaleY(31);
end;
with WizardForm.OuterNotebook do
begin
Height := ScaleY(500);
Top := ScaleY(0);
end;
with WizardForm.InnerNotebook do
begin
Height := ScaleY(490);
Top := ScaleY(0);
end;
with WizardForm.DirBrowseButton do
begin
Top := ScaleY(20);
Parent:=WizardForm.SelectComponentsPage;
end;
with WizardForm.DirEdit do
begin
Top := ScaleY(20);
Parent:=WizardForm.SelectComponentsPage;
end;
with WizardForm.ComponentsList do
begin
Top := ScaleY(60);
Height := ScaleY(430);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.ComponentsDiskSpaceLabel.Hide;
WizardForm.TypesCombo.Hide;
WizardForm.SelectComponentsLabel.Hide;
WizardForm.MainPanel.Hide;
WizardForm.Bevel1.Hide;
end;

saurn 08-02-2014 00:55 2305228

Цитата:

Цитата Ivan_009
Как добавить в начале скрипта проверку на Расширенную версию Inno Setup Compiler... »

Код:

#ifndef IS_ENHANCED
  #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif


The_Immortal 08-02-2014 05:07 2305278

Iska,
Цитата:

Цитата Iska
А без консоли? Лог-файл никак не устраивает? »

Неа, нужен именно вывод в консоль...

Цитата:

Цитата Iska
и для консоли как минимум нужны лишние телодвижения »

А в каком хотя бы направлении смотреть, не подскажите?

Iska 08-02-2014 05:38 2305284

Цитата:

Цитата The_Immortal
А в каком хотя бы направлении смотреть, не подскажите? »

Вот в этом: Console Reference.

diman_21Ru 08-02-2014 10:32 2305329

vint56 ,вышло чтото как то не так судя по скрину )

Farser21 08-02-2014 11:38 2305364

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

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

saurn 08-02-2014 11:50 2305373

Farser21, было.
http://forum.oszone.net/post-2296393-1949.html

Farser21 08-02-2014 12:21 2305392

saurn, спасибо, но есть небольшая проблема. Не как не могу настроить координаты.
Ранее я выставлял их так
Код:

procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with PicForm do
        begin
//            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            Left := ScaleX(700);    // Слева
            Top := ScaleY(545);    // Сверху
            Width := ScaleX(280);  // Ширина
            Height := ScaleY(215);  // Высота
            Show;
        end;
    finally
    end;
end;

Где в твоем примере нужно задать эти же координаты? Не как не получаеться.

saurn 08-02-2014 12:50 2305406

Farser21, там же:
Код:

procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    InfoPic.SetBounds(ScaleX(245), ScaleY(42), ScaleX(166), ScaleY(165));
                        Left          Top        Width      Height
    InfoPic.Show;
end;


vint56 08-02-2014 14:20 2305459

diman_21Ru ну правильно ты размеры изменил потому все элементы стоят не на своих местах

diman_21Ru 08-02-2014 14:28 2305466

vint56, а как мне сделать размер правильный ?

vint56 08-02-2014 14:36 2305472

diman_21Ru скачай inno ultra там есть расширенный редактор форм там вот в нем ты можеш увеличить формы и передвинуть обьекты как тебе надо

diman_21Ru 08-02-2014 14:40 2305473

vint56, у меня стоит и так расширенная но где именно там это изменять

vint56 08-02-2014 15:04 2305479

diman_21Ru редактор форм

Mailchik 08-02-2014 15:36 2305489

Цитата:

Цитата The_Immortal
Друзья, подскажите, пожалуйста, как можно в скрипте реализовать следующее в режиме verysilent:
если разрядность ОСи x86, то отменяем установку и в КОНСОЛЬ возвращаем какое-либо сообщение с кодом. »

С помощью библиотеки.

diman_21Ru 08-02-2014 16:02 2305500

Как исправить isdone.dll не найдено ни одного файла указанного для isarcextract. или же как отключить isdone в скрипте

Gnom_aka_Lexander 08-02-2014 16:21 2305505

diman_21Ru, положить эти файлы, которые указаны для isarcextract именно по тому пути, который указан в вызове функции. это проблема не isdone.dll, это проблема отсутствия желания разбираться в том, как она работает.

innot20 08-02-2014 20:00 2305603

подскажите пожалуйста как при опред. разрешении экрана
устанавливать подходящий мод

например
1. мод для разрешения **
2. мод для разрешения *****
3. мод для разрешения ****

если пользователь выбирает этот мод и у него разрешение ****, то ему установиться - 3. мод для разрешения ****

diman_21Ru 08-02-2014 20:39 2305619

Поправьте пожалуйста мой скрипт чтоб на первом скрине вышло как на втором , зарание спасибо :)
http://rghost.ru/52291369

1specific 08-02-2014 20:52 2305622

Друзья, скажите пожалуйста, как сделать, чтоб при запуске инсталятора на Windows 8 не выдавало ошибку "SmartScreen предотвратил запуск приложения"?

отключение UAC не катит в данном случае, т.к. у пользователей которые будут качать даже мысли такой не возникнет.
Вобще почему к каким то приложениям (с неизвестным издателем замечу) применяется предотвращение запуска, а к каким то нет

diman_21Ru 08-02-2014 21:26 2305633

1specific ,нажмите на подробно и запустите

1specific 08-02-2014 21:33 2305634

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

diman_21Ru 08-02-2014 21:35 2305637

1specific, тогда обьясни им что выключается Нажмите одновременно клавиши Win + x. Откройте панель управления. Откройте "Центр поддержки" (Под категорией "Система и безопасность" нажмите ссылку "Проверка состояния компьютера").
Раскройте "Безопасность", нажав стрелку справа. Найдите "Windows SmartScreen".
нажмите "Настройка параметров", введите пароль, если потребуется, и отключите функцию, нажмите "ОК", поднимтесь вверх по окну, поставьте в красном предупреждении "не получать больше сообщения на тему "Windows SmartScreen" "
"Windows SmartScreen" - защитная функция, отправляет сведения о запускаемых программах и посещаемых страницах на сравнение с базой данных опасных файлов и блокирует их запуск, если такая опасность подтверждается.

1specific 08-02-2014 21:39 2305641

diman_21Ru, Спасибо, но вопрос собственно в другом. С приложением сделать что то можно, чтоб такого не происходило?

diman_21Ru 08-02-2014 21:42 2305642

1specific , да самый легкий способ открыть с совместимостью Windows 7

1specific 08-02-2014 21:44 2305643

diman_21Ru, Вы шутите? Я спрашиваю не как пользователь программы, а как человек, который упаковал эту программу с помощью Inno Setup. На уровне упаковки что-то сделать можно? Еще раз повторяю как обойти пользователю эту хрень - я знаю, но мне не это нужно!

diman_21Ru 08-02-2014 21:45 2305644

1specific, а так если только использовать последнюю версию Inno setup и работая на Windows 8 проблемы такой не возникнет

vint56 08-02-2014 22:11 2305649

diman_21Ru
http://rghost.ru/52293611

diman_21Ru 08-02-2014 22:14 2305652

vint56, WizardForm.DoubleBuffered:=True; ошибка (

vint56 08-02-2014 22:23 2305656

diman_21Ru это потому что у меня компилятор unicode либо удали строчку либо используй unicode но с ней лутше мелькать обьекты будут меньше

1specific 08-02-2014 22:27 2305659

diman_21Ru, Не помогло.

diman_21Ru 08-02-2014 22:32 2305663

vint56 , ясно попробую

1specific,тогда можно попробовать включать запуск от администратора в скрипт

1specific 08-02-2014 22:37 2305668

diman_21Ru, Как это можно реализовать?

diman_21Ru 08-02-2014 22:57 2305677

1specific,
[Setup]
PrivilegesRequired=admin

1specific 08-02-2014 22:58 2305678

diman_21Ru, Этот способ также не помогает.

diman_21Ru 08-02-2014 23:08 2305685

1specific ,простите большего способа пока не знаю

Grogan508 08-02-2014 23:56 2305714

diman_21Ru,
на ansi restool работает
http://rghost.ru/52296003

diman_21Ru 09-02-2014 10:50 2305817

Grogan508, работает ага , но так же и без одной из строчек тоже в принципе

diman_21Ru 09-02-2014 11:35 2305839

Как можно убрать третью страницу в скрипте где распаковывается софт и как можно первую страницу кнопки поставить так , как на первом скрине ,заранее спасибо :)
Вот скрипт : http://rghost.ru/52302333

Farser21 09-02-2014 12:42 2305863

Всем привет, столкнулся с такой проблемой.
У меня стоит процедура на показ картинок при наведении на компонент.
Все работает хорошо, но есть одно но.
В компонентах есть разделы
Прицелы и Арт-прицелы.
И в обоих разделах есть компонент Анимированные.
Если я добавлю скриншот в установщик, то на оба компонента будет 1 скриншот.
Как можно отдельно поставить скриншот под эти 2 компонента, не меняя их названия.
Может какой-то процедурой определять по номеру или что-то в этом роде.

Заранее спасибо за ответ!

diman_21Ru 09-02-2014 12:57 2305870

Farser21 , я эту проблему решил разделил мод на 2 чясти т.е галочка и кружек и так далее

Farser21 09-02-2014 13:03 2305873

diman_21Ru, о чем ты? Расскажи поподробней.

diman_21Ru 09-02-2014 13:05 2305876

Farser21 ,скриншот покажи я обьясню !

Grogan508 09-02-2014 13:10 2305879

diman_21Ru,
примерно так http://rghost.ru/52303698

diman_21Ru 09-02-2014 13:31 2305888

Grogan508, а кнопки как можно расположить как в другом скрине не знаешь ?

innot20 09-02-2014 13:56 2305902

Цитата:

Цитата innot20
подскажите пожалуйста как при опред. разрешении экрана
устанавливать подходящий мод
например
1. мод для разрешения **
2. мод для разрешения *****
3. мод для разрешения ****
если пользователь выбирает этот мод и у него разрешение ****, то ему установиться - 3. мод для разрешения **** »


Farser21 09-02-2014 14:42 2305924

Код:

Всем привет, столкнулся с такой проблемой.
У меня стоит процедура на показ картинок при наведении на компонент.
Все работает хорошо, но есть одно но.
В компонентах есть разделы
Прицелы и Арт-прицелы.
И в обоих разделах есть компонент Анимированные.
Если я добавлю скриншот в установщик, то на оба компонента будет 1 скриншот.
Как можно отдельно поставить скриншот под эти 2 компонента, не меняя их названия.
Может какой-то процедурой определять по номеру или что-то в этом роде.

Заранее спасибо за ответ!

Вообщем подумал, чтобы показывалась картинка нужно чтобы совпадали названия картинки и компонента.
Возможно ли как-то сделать сделать это по какой-то нумерации ?

Valera90 09-02-2014 15:11 2305945

Как можно изменить на кнопках текст ?

diman_21Ru 09-02-2014 15:11 2305948

Valera90,
[Messages]
ButtonBrowse=
ButtonGroupBrowse=
ButtonNext=
ButtonBack=
ButtonCancel=
ButtonFinish=
ComponentsDiskSpaceMBLabel=

Valera90 09-02-2014 17:17 2306033

Подскажите пожалуйста как можно сделать Черный инсталляттор ?

diman_21Ru 09-02-2014 17:20 2306035

Valera90,самый легкий способ .
const
Color = clblack;

procedure InitializeWizard();
begin
WizardForm.Font.Color:=clLime;
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:=clblack;
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.WelcomeLabel1.Font.Color:=clLime;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageNameLabel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.FinishedLabel.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.FinishedHeadingLabel.Color:=Color;
WizardForm.FinishedHeadingLabel.Font.Color:=clLime;
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.PageNameLabel.Font.Color:=clLime;
WizardForm.Bevel.visible:=False;
WizardForm.BeveledLabel.visible:=False;
WizardForm.Bevel1.visible:=False;
end;

diman_21Ru 09-02-2014 18:18 2306076

Подскажите пожалуйста как можно кнопки изменить и добавить как тут ,заранее спасибо за ответ
Вот скрипт : http://rghost.ru/52302333

Ivan_009 09-02-2014 19:55 2306127

diman_21Ru, Так:

Код:

with WizardForm.NextButton do begin
Width := ScaleX(90); // ШИРИНА
Height := ScaleY(21); // ВЫСОТА
end;

Или же создать кнопку:

Код:

var
about: TNewButton;

About := TNewButton.Create(WizardForm);
with About do
begin
Parent := WizardForm;
Left := ScaleX(13);
Top := ScaleY(364);
Width := ScaleX(95);
Height := ScaleY(25);
Caption := 'О релизе';
//OnClick := @AboutClick;
Cursor:= crHand;
end;


Grogan508 09-02-2014 20:46 2306151

diman_21Ru,
такой вариант
http://rghost.ru/52315786

diman_21Ru 09-02-2014 21:31 2306180

Grogan508 ,неплохо но все же мне хотелось бы убрать страницу где софт .

vint56 10-02-2014 00:11 2306270

diman_21Ru
DisableProgramGroupPage=yes

diman_21Ru 10-02-2014 00:15 2306273

vint56, замечательно спасибо

Grogan508 10-02-2014 00:25 2306279

diman_21Ru,
примерно так
http://rghost.ru/52321362

Raf-9600 10-02-2014 00:49 2306293

А на страницу "выбора дополнительных задач", которая появляется если в разделе скрипта [Tasks] что-то указать, можно как-то хинты пунктам выбора прикрутить?

Farser21 10-02-2014 01:18 2306306

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

Raf-9600 10-02-2014 01:22 2306309

Цитата:

Цитата Farser21
Возможно ли как-то, чтобы когда нажимаешь на компонент то там где находиться картинка "Модификации" появлялось видео с ютуба с таким же размером как и изображение и можно было его просмотреть? »

Было бы очень круто. Но вряд ли у кого-то найдётся для этого скриптик.

Farser21 10-02-2014 01:28 2306310

Raf-9600, Да вот у кого-то видел, правда там просто видео было не в компонентах) Ну может есть способ, было бы действительно круто)

Raf-9600 10-02-2014 01:38 2306313

Цитата:

Цитата Farser21
Да вот у кого-то видел »

Смею так же предположить что это видео было не из Ютуба. И здесь, и на РуБоарде, было уже несколько скриптов для воспроизведения вшитого в инсталлятор видео на странице установки. Вероятно его работу вы и видели.

Grogan508 10-02-2014 03:45 2306341

diman_21Ru,
немного переделал
http://rghost.ru/52323348

saurn 10-02-2014 08:28 2306366

Цитата:

Цитата Raf-9600
А на страницу "выбора дополнительных задач", которая появляется если в разделе скрипта [Tasks] что-то указать, можно как-то хинты пунктам выбора прикрутить? »

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

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


[Tasks]
Name: ts1; Description: Задача 1;
Name: ts2; Description: Задача 2;


[CustomMessages]
_CM_DESC_0=Наведите курсо мыши на задачу.
_CM_DESC_1=Задача 1
_CM_DESC_2=Задача 2


[code]
var
   
_TasksDSC: TRichEditViewer;


procedure _TasksOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
   
_TasksDSC.Text := #32 + CustomMessage('_CM_DESC_' + IntToStr(Index + 1));
end;


procedure _TasksOnMouseLeave(Sender: TObject);
begin
   
_TasksDSC.Text := #32 + CustomMessage('_CM_DESC_0');
end;


procedure _EditControls();
begin
    with
WizardForm do
    begin
       
TasksList.SetBounds(ScaleX(0), ScaleY(SelectTasksLabel.Top + SelectTasksLabel.Height + ScaleY(20)), ScaleX((SelectTasksLabel.Width - ScaleX(5)) div 2), ScaleY(ScaleY(165)));
        TasksList.OnItemMouseMove := @_TasksOnItemMouseMove;
        TasksList.OnMouseLeave := @_TasksOnMouseLeave;
        TasksList.BorderStyle := bsSingle;

        _TasksDSC := TRichEditViewer.Create(SelectTasksPage);
        with _TasksDSC do
        begin
           
Parent := SelectTasksPage;
            SetBounds(ScaleX(TasksList.Left + TasksList.Width + ScaleX(5)), ScaleY(TasksList.Top), ScaleX(TasksList.Width), ScaleY(TasksList.Height));
            ReadOnly := True;
            Color := TasksList.Color;
            RTFText := #32 + CustomMessage('_CM_DESC_0');
        end;
    end;
end;


procedure InitializeWizard;
begin
   
_EditControls();
end;

По мотивам http://forum.oszone.net/post-2030282-1308.html

Ivan_009 10-02-2014 10:35 2306406

Цитата:

Цитата Raf-9600
Смею так же предположить что это видео было не из Ютуба. И здесь, и на РуБоарде, было уже несколько скриптов для воспроизведения вшитого в инсталлятор видео на странице установки. Вероятно его работу вы и видели. »

Raf-9600, Пробуйте примеры использования внутри: http://rghost.ru/52325205

diman_21Ru 10-02-2014 13:53 2306504

В [CustomMessages] есть название игры как можно изменить размер текста

Ivan_009 10-02-2014 14:42 2306548

Цитата:

Цитата diman_21Ru
В [CustomMessages] есть название игры как можно изменить размер текста »

Так:

Код:

var
WelcomeLabel1: TLabel;

WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do begin
AutoSize:=False;
SetBounds(ScaleX(25), ScaleY(219), ScaleX(550), ScaleY(80));
WordWrap:=True;
Alignment := taCenter;
Transparent:=True;
Font.Name:='Trebuchet MS';
Font.Style := [fsBold];
Font.Size:= 10; // Размер текста
Font.Color:=$000000;
Caption:= ExpandConstant('{cm:Welcome}');
Parent:=WizardForm;
end;


diman_21Ru 10-02-2014 20:37 2306806

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

Ivan_009 10-02-2014 21:46 2306865

diman_21Ru, Скрипт В студию... :clapping:

Grogan508 10-02-2014 21:47 2306866

diman_21Ru,
WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do begin
AutoSize:=False;
SetBounds(ScaleX(-130), ScaleY(31), ScaleX(550), ScaleY(70));
WordWrap:=True;
Alignment := taCenter;
Transparent:=True;
Font.Name:='constantia'; //
Font.Size:= 11; //размер шрифта верхней группы на первой странице
Font.Color:=clblack; //цвет red white
Font.Style:=[fsBold];
Caption:= ExpandConstant('{cm:Welcome1}');
Parent:=WizardForm.WelcomePage;

diman_21Ru 10-02-2014 22:02 2306879

Ivan_009 ,Grogan508,скрипт крайне странный негде даже вводить размеры нету.
http://rghost.ru/52339807

Grogan508 10-02-2014 22:34 2306913

diman_21Ru, diman_21Ru,
скрин в архиве
http://rghost.ru/52340640

Ivan_009 10-02-2014 22:34 2306914

diman_21Ru, Походу это нереально сделать. Если только резать форму и создать новый лейбел.

Попробуй сократить название в Messages.iss так:

Код:

[CustomMessages]
rus.Main=«{#MyAppName}»

Или тебе можно скин накатить...

sergey3695 10-02-2014 22:40 2306923

diman_21Ru,
WizardForm.Caption:= 'тут текст'; или сделай форму длиннее. (но проще первое)

diman_21Ru 10-02-2014 22:41 2306926

Ivan_009 , все помогло спасибо

_Akim_ 10-02-2014 22:50 2306937

Ребят помогите, что то никак не могу найти пример кода. Нужно чтоб при установке создавался бэкап папки (копированием) а при повторном запуске инсталятора проверялось бы наличие этой бэкап папки, и если она есть то повторно не бэкапить.

habib2302 10-02-2014 23:21 2306961

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

хотя в секции Setup указал
Код:

CreateUninstallRegKey=not IsComponentSelected('AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua')

saurn 11-02-2014 05:03 2307050

Цитата:

Цитата _Akim_
Ребят помогите, что то никак не могу найти пример кода. Нужно чтоб при установке создавался бэкап папки (копированием) а при повторном запуске инсталятора проверялось бы наличие этой бэкап папки, и если она есть то повторно не бэкапить. »

Пример
Код:

#define CUR_DIR "main" ;Глобально: папка, откуда копируем.
#define BAK_DIR "_backup" ;Глобально: папка, куда копируем.

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}\main; Flags: external overwritereadonly ignoreversion;


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';


var
   
backupChk: TCheckBox;


procedure IsBackup(const FromDir: String; const ToDir: String);
var
   
fileArray: array of String;
    FindFiles: TFindRec;
    i, Len: Integer;
begin
   
fileArray := ['*'];
    Len := GetArrayLength(fileArray) - 1;
    for i := 0 to Len do
    begin
        if
FindFirst(FromDir + fileArray[i], FindFiles) then
        try
           
WizardForm.ProgressGauge.Hide;
            WizardForm.StatusLabel.Caption := 'Создание резервной копии файлов...';

            repeat
                if not
DirExists(ToDir) then CreateDir(ToDir);
                  CopyFile(FromDir + FindFiles.Name, ToDir + FindFiles.Name, False);
            until not FindNext(FindFiles);
        finally

           
WizardForm.ProgressGauge.Show;
            FindClose(FindFiles);
        end;
    end;
end;


procedure InitializeWizard();
var
   
ThereIsFolders: Boolean;
begin
   
backupChk := nil;
    ThereIsFolders := (DirExists(AddBackslash(WizardDirValue()) + '{#CUR_DIR}') and //Проверяем, есть ли папка, откуда копируем файлы.
                     
(not DirExists(AddBackslash(WizardDirValue()) + '{#BAK_DIR}')) ); //Проверяем, что папка, куда копируем файлы не существует.

   
if ThereIsFolders then //Если оба вышеозначенных условия соблюдены создаем чекбокс.
   
begin
       
backupChk := TCheckBox.Create(nil);
        with backupChk do
        begin
           
Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(WizardForm.DirEdit.Left), ScaleY(WizardForm.DiskSpaceLabel.Top div 2), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));
            Caption := 'Сохранить резервную копию перезаписываемых файлов';
            Checked := ThereIsFolders;
        end;
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssInstall: if backupChk <> nil then //Проверяем, создан ли чекбокс.
                   
if backupChk.Checked then //Если чекбокс создан, проверяем отмечен ли он
                      //Вызываем процедуру создания резервной копии файлов нв этапе перед установкой.
                     
IsBackup(ExpandConstant('{app}\{#CUR_DIR}\'), //Папка, откуда копируем файлы.
                     
ExpandConstant('{app}\{#BAK_DIR}\')); //Папка, куда копируем файлы.
   
end;
end;

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

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

habib2302
Код:

[Setup]
CreateUninstallRegKey=_CheckIsComponents

[Code]
function _CheckIsComponents(): Boolean;
begin
    Result := not IsComponentSelected('AIDA64\Portable\1') and
    not IsComponentSelected('AIDA64\Portable\2') and
    not IsComponentSelected('AIDA64\Portable\3');
end;

Цитата:

Цитата habib2302
CreateUninstallRegKey=not IsComponentSelected('AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua') »

IsComponentSelected('...'): здесь должно быть указано имя компонента, одного, а не всех компонентов разом, да еще и языков зачем-то. В итоге для компилятора это строка считается именем одного компонента, вот он и проверяет, отмечен ли компонент под именем AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua

_Akim_ 11-02-2014 13:24 2307195

Цитата:

Цитата saurn
Имейте ввиду, что удовлетворительным результатом здесь является исключительно отсутствие папки. Если папка есть, но она пуста, все равно будет возвращен False результат. »

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

diman_21Ru 11-02-2014 14:53 2307264

Всем привет у Jove в мод-паке появилась занятная функция Авто-оповещение об обновлении Модпака как это можно реализовать ?

innot20 11-02-2014 17:04 2307332

Цитата:

Цитата diman_21Ru
Всем привет у Jove в мод-паке появилась занятная функция Авто-оповещение об обновлении Модпака как это можно реализовать ? »

это мод для танков и к inno setup он никак не относится

diman_21Ru 11-02-2014 19:34 2307412

innot20 ,это не мод а Launcher

Valera90 11-02-2014 20:28 2307447

diman_21Ru, да меня тоже интересует это может кто то знает как это сделать ?

diman_21Ru 11-02-2014 20:37 2307457

Как можно исправить сбоку баг на windows 7 все нормально но на Windows 8 вот как понимаю из за совместимости но все же можно может как то решить :)

saurn 11-02-2014 20:54 2307469

Цитата:

Цитата diman_21Ru
Авто-оповещение об обновлении Модпака как это можно реализовать ? »

Написать утилиту, которая будет проверять наличие обновлений на некоем сервере. Только Inno - то тут каким боком?
Цитата:

Цитата diman_21Ru
Как можно исправить сбоку баг »

Похоже на косяк скинирования.

habib2302 11-02-2014 21:02 2307472

Цитата:

Цитата saurn
Написать утилиту, которая будет проверять наличие обновлений на некоем сервере. Только Inno - то тут каким боком? »

согласен. как в angry birds в конфиге указал сервак а утилита сканирует наличие новой версии и т.д.

diman_21Ru 11-02-2014 21:39 2307489

habib2302, а расширенный Inno Setup ведь только 5.5.1 или же есть выше может выше версия исправит мой баг

habib2302 11-02-2014 22:05 2307499

выше 5.5.1 еще нет. а в текстовом файле лицензии нет этого. попробуй изменить формат текстового файла txt->rtf или rtf->txt

TryRooM 12-02-2014 04:51 2307625

diman_21Ru,
такой вариант
http://rghost.ru/52373209

diman_21Ru 12-02-2014 08:27 2307655

TryRooM,спасибо

habib2302 ,rtf->txt не дало нечего может прокрутку сбоку можно дорисовать как то

diman_21Ru 12-02-2014 11:12 2307721

Как можно реализовать компоненты сюда добавляю просто [Components] не работает
вот скрипт : http://rghost.ru/52375292

TryRooM 12-02-2014 11:28 2307734

diman_21Ru,
добавил сайт
http://rghost.ru/52375404

diman_21Ru 12-02-2014 11:34 2307742

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

diman_21Ru 12-02-2014 12:49 2307785

Походу скрипт не вышел но запустите и посмотрите пожалуйста

El Sanchez 12-02-2014 19:31 2308009

Цитата:

Цитата diman_21Ru
Как можно исправить сбоку баг на windows 7 все нормально но на Windows 8 вот как понимаю из за совместимости но все же можно может как то решить »

Цитата:

Цитата saurn
Похоже на косяк скинирования. »

Да, встречал я такое пропадание скроллбара при использовании IsSkin/IsSkinEx.dll. При размере шрифта, отличном от умолчального, у ComponentsList не отрисовывается скроллбар, хотя такой же компонент TasksList отрисовывает как надо. Выставление у ComponentList таких же свойств, как у TasksList, ничего не дало. Но, если запускать на системе с классической темой, то скроллбар у ComponentList рисуется. Поэтому перед инициализацией скина необходимо установщику отрубить визуальные стили. Инициализацию скина проводят либо в InitializeSetup, либо при многоязычном установщике в InitializeLanguageDialog (если версия IS расширенная), поэтому первой строкой в теле одной из этих функций нужно написать:
Код:

procedure SetThemeAppProperties(dwFlags: DWORD); external 'SetThemeAppProperties@uxtheme.dll stdcall';

function InitializeSetup(): Boolean;
begin
   
// disable visual style
   
SetThemeAppProperties(0);

    // load skin
   
...
end;


Ivan_009 13-02-2014 11:13 2308301

Как можно прописать в скрипте запрет установки в Windows XP... :gamer: Кроме остальных систем...
Большое прибольшое спасибо за помощь...

saurn 13-02-2014 11:45 2308325

Ivan_009
Код:

[Setup]
MinVersion: 0,6.0 //Vista, Server 2008 and above


diman_21Ru 13-02-2014 12:47 2308372

В скрипте стоит каталог как можно заменить на компоненты, а то не выходит список модов

diman_21Ru 13-02-2014 13:10 2308388

Вот скрин , я добавил в скрипт [Components] а они не выходят

saurn 13-02-2014 13:14 2308391

Цитата:

Цитата diman_21Ru
Вот скрин »

Еще лучше... Компоненты на скрине рисовать? Скрипт где?

diman_21Ru 13-02-2014 13:49 2308419

saurn , не тот скрипт дал вот http://rghost.ru/52399830

diman_21Ru 13-02-2014 14:43 2308441

saurn, получяеться чтоли ?

diman_21Ru 13-02-2014 15:12 2308459

Кто может помочь отпишитесь пожалуйста крайне срочно нужно

Ivan_009 13-02-2014 15:12 2308460

Цитата:

Цитата diman_21Ru
saurn, получяеться чтоли ? »

Цитата:

Цитата diman_21Ru
Кто может помочь отпишитесь пожалуйста крайне срочно нужно »

:offtopic:

diman_21Ru 13-02-2014 15:19 2308466

Ivan_009, если можешь помочь то посмотри ты пожалуйста

Valera90 13-02-2014 15:49 2308481

Кстати да diman_21Ru хороший вопрос задал я вот тоже не могу компоненты включить только скрипт у меня другой вот http://rghost.ru/52402170

saurn 13-02-2014 16:35 2308519

Вложений: 1
diman_21Ru, хватит плодить одинаковые посты, яж не живу на форуме. Скрипт во вложении. Редактирование координат контролов и графика листа компонентов уже на вас. Нет времени.

diman_21Ru 13-02-2014 16:41 2308522

saurn, спасибо

vk.smoky@vk 13-02-2014 17:37 2308568

Как убрать файлы unins000??? Что-бы после установки они не появлялись.

Shkutu 13-02-2014 17:58 2308592

vk.smoky@vk,
Код:

[Setup]
Uninstallable=no


Raf-9600 14-02-2014 11:39 2308980

Цитата:

Цитата Raf-9600
А на страницу "выбора дополнительных задач", которая появляется если в разделе скрипта [Tasks] что-то указать, можно как-то хинты пунктам выбора прикрутить? »

Цитата:

Цитата saurn
Так? »

Нет, мне нужны именно Hint, то есть всплывающие подсказки.

vint56 14-02-2014 13:08 2309028

Raf-9600
читать дальше »

#define MyAppName "Company of Heroes Anthology"
#define MyAppVersion "1.0"
#define MyAppExeName "Cod.exe"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName=CCleaner 4.09
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}


[Icons]
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: IconsCheck;

[code]
var
TasksPage: TWizardPage;
TasksLabel: TLabel;
DopIcons: TLabel;
CheckIcons: TNewCheckBox;

function IconsCheck: Boolean;
begin
Result:= CheckIcons.Checked;
end;

procedure InitializeWizard();
begin
TasksPage := CreateCustomPage(wpSelectProgramGroup, 'Выберите дополнительные задачи', 'Какие дополнительные задачи необходимо выполнить?');
TasksLabel := TLabel.Create(WizardForm);
with TasksLabel do
begin
Parent := TasksPage.Surface;
AutoSize := False;
WordWrap := True;
Caption := 'Выберите дополнительные задачи, которые должны выполниться при установке {#SetupSetting("AppName")}, после этого нажмите «Далее»:';
ShowAccelChar := False;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(417);
Height := ScaleY(27);
end;
DopIcons := TLabel.Create(WizardForm);
with DopIcons do
begin
Parent := TasksPage.Surface;
Caption := 'Дополнительные значки:';
Left := ScaleX(20);
Top := ScaleY(30);
Width := ScaleX(130);
Height := ScaleY(13);
end;
CheckIcons := TNewCheckBox.Create(WizardForm);
with CheckIcons do
begin
Parent := TasksPage.Surface;
Left := ScaleX(30);
Top := ScaleY(50);
Width := ScaleX(201);
Height := ScaleY(17);
Hint := 'Значек на рабочем столе';
Caption := 'Создать ярлык на рабочем столе';
ParentShowHint := False;
ShowHint := True;
Checked:=True;
end;
end;

Shkutu 14-02-2014 16:08 2309116

Здравствуйте!
Обнаружился интересный момент. Если у файла в секции [Files] стоит проверка Check, то при подсчете объема памяти для установки этот файл не учитывается. Подскажите плиз, можно ли это как-то исправить/обойти?

Raf-9600 15-02-2014 01:32 2309344

vint56, не, создание кастомной странички это слишком круто. Я надеялся что всплывашки на стандартную можно как-то прилепить... Но если нельзя то ладно.

Собственно у меня новый вопрос: можно ли как-то узнать разрешение экрана и в зависимости от того какое разрешение заносить в реестр определённый DWORD ключ?

ChVL 15-02-2014 09:15 2309383

Из реестра экспортируется reg файл, в котором есть такие, например, строки:

@="\"C:\\Program Files\\MyTeam\\MyProg\\MyProg.exe\",0"
@="\"C:\\Program Files\\MyTeam\\MyProg\\MyProg.exe\" --started-from-file \"%1\""

ISTool их честно в скрипт так и записывает:

ValueData: "\""{app}\MyProg.exe\"",0"
ValueData: "\""{app}\MyProg.exe\"" --started-from-file \""%1\"""

Однако такую запись Windows не понимает, приходится убирать лишние слеши:

ValueData: """{app}\MyProg.exe"",0"
ValueData: """{app}\MyProg.exe"" --started-from-file ""%1"""

Слеши эти добавляются при экспортировании, а если reg файлик запустить, то запись оказывается нормальной. Иными словами, при экспортировании запись искажается, а при запуске такого reg файла - восстанавливается. На кой ляд такую хренотень замутили в Windows - не понятно.
Тем не менее из-за этого вот такой путь: [исходная запись в реестре > экспорт в reg файл > ISTool > скрипт > инсталляция > полученная запись в реестре] для подобных записей напрямую не проходит - требуется ручная корректировка скрипта.

Есть способ сделать без фокусов и на автомате?

Johny777 15-02-2014 14:44 2309472

Raf-9600,
RegWriteDWordValue(..., Screen.Width);
RegWriteDWordValue(..., Screen.Height);


vk.smoky@vk, установить атрибут "скрытный"
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Nordek 15-02-2014 18:27 2309550

Цитата:

Цитата ChVL
На кой ляд такую хренотень замутили в Windows - не понятно. »

Ну-ну.
Код:

[Registry]
Root: HKCR; SubKey: .323; ValueType: string; ValueData: """C:\Program Files\MyTeam\MyProg\MyProg.exe"",0"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCR; SubKey: .323; ValueType: string; ValueData: """C:\Program Files\MyTeam\MyProg\MyProg.exe"" --started-from-file ""%1"""; Flags: uninsdeletevalue uninsdeletekeyifempty

но даже и в этом случае будет не правильно.

Правильней будет так:
Код:

[Registry]
Root: HKCR; SubKey: .323; ValueType: string; ValueData: """{app}\MyTeam\MyProg\MyProg.exe"",0"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCR; SubKey: .323; ValueType: string; ValueData: """{app}\MyTeam\MyProg\MyProg.exe"" --started-from-file ""%1"""; Flags: uninsdeletevalue uninsdeletekeyifempty


А если учитывать то, что если в секции [Setup] будет прописан путь в DefaultDirName т.е
Код:

[Setup]
DefaultDirName={pf}\MyTeam\MyProg

то в секции [Registry] можно удалить лишние значения:
Код:

[Registry]
Root: HKCR; SubKey: .323; ValueType: string; ValueData: """{app}\MyProg.exe"",0"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCR; SubKey: .323; ValueType: string; ValueData: """{app}\MyProg.exe"" --started-from-file ""%1"""; Flags: uninsdeletevalue uninsdeletekeyifempty

И ChVL, чего первое сообщение не читаем, особое приглашение нужно?
Цитата:

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

»

Увидел?

ChVL 15-02-2014 19:15 2309571

Nordek,
Какой должна быть правильная запись, я знаю. Всё, что Вы здесь расписали - так и сделано. Ещё раз внимательно прочтите мой пост.
Вопрос в другом: как автоматически пройти тот путь, который указан в моём посте, т.е. исключить необходимость ручной правки скрипта.

P.S. И с какой целью Вы мне сделали особое приглашение, я так и не понял.

Nordek 15-02-2014 20:57 2309623

Цитата:

Цитата ChVL
Всё, что Вы здесь расписали - так и сделано. »

Что именно сделано?
Экспортированно через
Цитата:

Цитата ChVL
ISTool »

а затем правка? Про Converter ни слова не написал.
ISTool и InnoIDE не умеют правильно обрабатывать ключи.

Для этого используй Converter или Inno Script Studio - вставляют правильно, без слеша..

Цитата:

Цитата ChVL
Вопрос в другом: как автоматически пройти тот путь, который указан в моём посте, т.е. исключить необходимость ручной правки скрипта. »

Совсем не получится.
Например если в файле reg присутствует путь "C:\\Program Files\\MyTeam\\MyProg\\MyProg.exe" то в ValueData так и запишется "C:\Program Files\MyTeam\MyProg\MyProg.exe" и речи, ни о каких "{app}\MyProg.exe" не может быть идти т.к в программах за ранее не заложена вставка-(автоматическая замена) переменных Inno для реестра.

И ещё один момент: На кой в секции [Registry] прописаны эти:
Код:

Root: "HKCR"; Subkey: ".323"; ValueType: string; ValueData: """C:\Program Files\MyTeam\MyProg\MyProg.exe"",0"
Код:

Root: "HKCR"; Subkey: ".323"; ValueType: string; ValueData: """C:\Program Files\MyTeam\MyProg\MyProg.exe"" --started-from-file ""%1"""
две строки?
Одна для значка а другая исполняемая?
При инсталляции запишется только одна, т.е при инсталляции запишется первая - а затем первую, заменит вторая - либо наоборот. По этому всё равно запишется только одно значение.

Правильнее будет так (покажу на примере ассоциации расширения *.text к AkelPad-у):
Код:

[Registry]
Root: HKLM; Subkey: Software\Classes\.text; ValueType: string; ValueName: ; ValueData: AkelPad.Note; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\Classes\AkelPad.Note\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\AkelPad.exe,1; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\Classes\AkelPad.Note\shell\open\command; ValueType: string; ValueName: ; ValueData: "{app}\AkelPad.exe ""%1"""; Flags: uninsdeletevalue

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

ChVL 15-02-2014 21:35 2309639

Цитата Nordek:
ISTool и InnoIDE не умеют правильно обрабатывать ключи.
Для этого используй Converter или Inno Script Studio - вставляют правильно, без слеша.. »

Вот так и надо было ответить сразу.
Спасибо.

Добавлено.
Строки были приведены для примера и взяты они были из разных ключей, просто реальные имена заменены на MyProg.
Что Вы никак не успокоитесь. В каждом посте: то высокомерно делаете особое приглашение, то прямое указание, что я должен понимать в первую очередь.
Вы точно знаете уровень моих знаний? И что надо в первую, а что во вторую очередь, а? С каких щей Вы присвоили себе право поучать?

Ivan_009 15-02-2014 21:50 2309651

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

Вот:

Код:

var
DirEditLabel, GroupEditLabel: TLabel;

procedure InitializeWizard;
begin

  DirEditLabel := TLabel.Create(WizardForm);
  with DirEditLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(5), ScaleY(85), ScaleX(446), ScaleY(15));
    WordWrap:= True;
    ShowAccelChar := False;
    Transparent:=True;
    Font.Name:= 'Arial'
    Font.Size:= 9;
    Font.Color:=$000000;
    Font.Style:=[fsBold];
    Caption := MinimizePathName(WizardForm.DirEdit.Text, DirEditLabel.Font, DirEditLabel.Width);
    Parent := WizardForm.SelectDirPage;
  end;

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

procedure HideComponents;
begin
  WizardForm.DirEdit.Hide;
  WizardForm.GroupEdit.Hide;
  DirEditLabel.Hide;
  GroupEditLabel.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  HideComponents;
  case CurPageID of
  wpSelectDir:
  begin
  DirEditLabel.Show;
  end;
  wpSelectProgramGroup:
  GroupEditLabel.Show;
end;
end;


Farser21 15-02-2014 23:33 2309688

Проблема такая стоит автопределение установки по реестру, но если в реестре не находит то строка с путем пустая. Далее выбираем куда установить и оно приписывает конечным путем \Новая папка.
В оригинале хотелось бы, что если в реестре не находит игру, то самому выбрать папку куда ты хочешь установить, и чтобы не было конечным путем \Новая папка.

Заранее спасибо за ответ!

saurn 16-02-2014 00:22 2309722

Цитата:

Цитата Farser21
В оригинале хотелось бы, что если в реестре не находит игру, то самому выбрать папку куда ты хочешь установить, и чтобы не было конечным путем \Новая папка. »

Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
AppId=MyApp
DefaultDirName={code:SetInstDir}

[Code]
function SetInstDir(const lpResult: String): String;
begin
   
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation',  lpResult);
    if lpResult <> '' then Result := RemoveBackslash(lpResult) else Result := ExpandConstant('{pf}\My Program');
end;

Или:
Код:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1, InstallLocation|{pf}\My Program}

Farser21 16-02-2014 13:35 2309858

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

Farser21 16-02-2014 15:18 2309897

saurn, Задается не Новая папка а MyProgram, а мне нужно чтобы ничего вообще не задавалось. Чтобы абсолютно можно было самому в ручную выбрать нужную папку в установщике.

saurn 16-02-2014 15:36 2309913

Farser21, только щас дошло о чем вы :)
Код:

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1, InstallLocation}
AppendDefaultDirName=no


Farser21 16-02-2014 17:40 2309954

saurn, Спасибо, все работает!

Ivan_009 16-02-2014 23:14 2310173

У кого имеется скрипт для создания авторуна. Зарание спасибо...

TryRooM 17-02-2014 05:30 2310285

Ivan_009,
autorun
http://rghost.ru/52478541

Nordek 17-02-2014 09:07 2310348

Цитата:

Цитата Ivan_009
У кого имеется скрипт для создания авторуна. »

В справке есть пример:
читать дальше »
Код:

// Где Image - Название изображения
#define Img "Image"

[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: {#Img}.bmp; Flags: dontcopy

[Messages]
SetupAppTitle=AutoRUN

[Code]
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\Electronic Arts\Game','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('{#Img}.bmp');
  with img1 do begin
   
Parent := AutoRun;
    Left := 0;
    Stretch:= true;
    Top := 0;
    Width := Autorun.Width;
    Height := Autorun.Height;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\{#Img}.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 := 80;
    Width := 150;
    Height := 22;
    Caption:= 'Install Game';
    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;
    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;

Код:

[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

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


[Messages]
SetupAppTitle=AutoRUN

[Code]
const
 
BM_CLICK    = $00F5;

var
 
AutoRun: TSetupForm;
  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\Electronic Arts\Game','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;
  //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 := 80;
    Width := 150;
    Height := 22;
    Caption:= 'Install Game';
    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;
    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;


Shkutu 17-02-2014 14:53 2310524

Доброго времени суток!
Подскажите плиз, какой компонент отвечает за дропбокс с типами установки?

saurn 17-02-2014 15:19 2310542

Shkutu,
Код:

TWizardForm = class(TSetupForm)
    property TypesCombo: TNewComboBox; read;


Shkutu 17-02-2014 15:27 2310547

saurn, да, спасибо.
И еще такая проблема. Повесила обработку выбора компонентов (на ComponentsList.OnClickCheck) - сломалось автоопределение типа. Подскажите плиз, куда можно повесить определение типа в зависимости от выбранных компонентов? Вешать на тот же OnClickCheck не получается, потому что тогда ломается выбор компонентов( Думала использовать что-то вроде на ComponentsList.OnChange, но ничего похожего пока не нашла

saurn 17-02-2014 15:32 2310551

Shkutu, да вроде не ломается.
читать дальше »
Код:

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


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


[Components]
Name: a; Description: Моя программа; ExtraDiskSpaceRequired: 15000000; Types: full custom;
Name: aa; Description: Руководство пользователя; ExtraDiskSpaceRequired: 2655285235; Types: custom
Name: aaa; Description: Русский; ExtraDiskSpaceRequired: 5587282385; Types: custom


[Code]
var
   
OldCompListOnClickCheckProc: TNotifyEvent;
    SpaceComponentsLabel: TLabel;


procedure ComponentsListOnClickCheck(Sender: TObject);
begin
   
OldCompListOnClickCheckProc(TNewCheckListBox(Sender));
    SpaceComponentsLabel.Caption := WizardForm.ComponentsDiskSpaceLabel.Caption;
end;


procedure InitializeWizard();
begin
   
WizardForm.ComponentsDiskSpaceLabel.Hide;
    OldCompListOnClickCheckProc := WizardForm.ComponentsList.OnClickCheck;
    WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;

    SpaceComponentsLabel:= TLabel.Create(nil);
    with SpaceComponentsLabel do
    begin
       
Parent := WizardForm.SelectComponentsPage;
        SetBounds(ScaleX(WizardForm.ComponentsDiskSpaceLabel.Left), ScaleY(WizardForm.ComponentsDiskSpaceLabel.Top), ScaleX(WizardForm.ComponentsDiskSpaceLabel.Width), ScaleY(WizardForm.ComponentsDiskSpaceLabel.Height));
        AutoSize := False;
        Font.Style := [fsBold];
        Font.Color := $0000FF;
    end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
    case
CurPageID of
       
wpSelectComponents: ComponentsListOnClickCheck(WizardForm.ComponentsList);
    end;
end;


У компонент листа, насколько мне известно, нет свойства OnChange

Shkutu 17-02-2014 16:07 2310569

saurn, обработчик был кривоватый :)
Спасибо, поправила как в Вашем примере, теперь ничего не ломается:)

Ivan_009 17-02-2014 17:24 2310626

Как прицепить дополнительную форму к инсталлятору и чтобы она была вверху инсталлятора.
Зарание спасибо...

habib2302 17-02-2014 22:28 2310780

доброе время суток. как распаковать .srep?

Ivan_009 17-02-2014 23:01 2310804

habib2302, Так:

Код:

if not ISSRepExtract  ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
Как и arc... :jester:

И справочку читани перед сном... :whitevoid: :kruto: :nunchaku:

habib2302 17-02-2014 23:21 2310814

Ivan_009, спасибо за помощь,но я создавал другим вариантом
#define SrepInside

Ivan_009 17-02-2014 23:28 2310818

habib2302, Это было изначально закоментированно .
Тоесть чего используешь то и раскоментируешь.

Код:

;#define records
;#define facompress
;#define PrecompInside
;#define SrepInside
;#define MSCInside
;#define precomp "0.42"
;#define unrar
;#define XDelta
;#define PackZIP


sergey3695 18-02-2014 09:00 2310929

habib2302, если быть точнее,а не только суть, то это директива препроцессора.

Ivan_009 18-02-2014 15:21 2311128

У кого нибудь имеется скрипт для распаковки архивов Zip и библиотека...
Зарание спасибо...

sergey3695 18-02-2014 15:39 2311138

Ivan_009, в шапке есть.

innot20 19-02-2014 06:53 2311558

здравствуйте возникла такая проблема, разработчики вг убрали поддержку модов в самолётах (случайно) и теперь приходится извращаться, подскажите пожалуйста как сделать в inno setup, чтобы архив из res/packages/gui.pkg и из res/packages/misc.pkg
распаковывался в res_mods
pkg это обычный архив

Ivan_009 19-02-2014 10:45 2311652

Подскажите, что за стиль текста такой : :biggrin:

Код:

Font.Style := [];

Nordek 19-02-2014 14:25 2311817

Цитата:

Цитата Ivan_009
Подскажите, что за стиль текста такой : :biggrin:
Код:

Font.Style := [];
»

Простой стиль шрифта.

Пример:
Код:

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Font.Style := [];
end;

Далее:
Код:

[fsBold]      - Жирный        Текст
[fsItalic]    - Курсив        Текст
[fsUnderline] - Подчёркнутый  Текст
[fsStrikeOut] - Зачёркнутый    Текст

Можно комбинировать:
Код:

// Жирный    Курсив    Подчёркнутый  Зачёркнутый
[  fsBold,    fsItalic, fsUnderline,  fsStrikeOut] // Текст


Dodakaedr 19-02-2014 22:55 2312112

А как создать чекбокс со своими параметрами. Например мне хочется создать чекбокс на финише с параметром закрепления ярлыка на панели задач (для этого есть скрипт). Как это оформить?

saurn 19-02-2014 23:59 2312142

Dodakaedr,
Код:

[Run]
Filename: имя скрипта VBS, включая полный путь; Parameters: """параметры запуска"""; WorkingDir: рабочая папка(можно не указывать); Flags: nowait postinstall shellexec; Description: описание;


Dodakaedr 20-02-2014 18:05 2312586

saurn, Спасибо, вечером попробую, отпишусь.

habib2302 20-02-2014 21:26 2312607

доброе время суток. я делаю репак adobe flash player и помогите мне добавить кнопки

и действия к ним

Dodakaedr 21-02-2014 00:34 2312736

saurn, Почему ошибку выдает?


habib2302 21-02-2014 01:47 2312771

Dodakaedr, вырежи секцию [Run] и всавь под др. секцией или поставь в конце, а не в середине секции

Dodakaedr 21-02-2014 02:47 2312791

habib2302, тоесть нужно команду run вставить после end?

nik1967 21-02-2014 07:09 2312833

Цитата:

Цитата Dodakaedr
habib2302, тоесть нужно команду run вставить после end? »

[run] это не команда, это секция. Ради интереса ткни клавишу F1 на клавиатуре и почитай справку (при запущенном окне Inno Setup). Или скачай русскую справку из шапки. Ну это же азы. Дальше - ты скопировал скрипт, поменяв только путь и имя скрипта. Я не вижу на скрине, как прописаны параметры, но это: "WorkingDir: рабочая папка(можно не указывать);" И ты думаешь у тебя не будет ошибки здесь? Нужно либо WorkingDir: {tmp};(в твоём случае), либо вообще ничего. Скрипт был дан в качестве примера.

saurn 21-02-2014 10:03 2312883

Цитата:

Цитата Dodakaedr
Почему ошибку выдает? »

Ну я-то написал в качестве примера, думая, что основы работы в Inno вам известны. Run - это отдельная секция. Она может располагатся до секции Code или после нее, но никак не внутри, или внутри какой-нибудь другой секции
Небольшое пояснение
Код:

[Run]
;Указывает инсталятору файл, который должен быть выполнен.
;Может включать в себя, как полный путь к файлу, так и константы путей.
;Если путь не указан, инсталятор будет руководствоватся параметром, указанным в WorkingDir.
;В данном случае будет запущен файл DXSETUP.EXE, находящийся в корневой папке инсталятора.
Filename: DXSETUP.EXE;

;Задает дополнительные параметры командной строки для запускаемого файла.
;Так же может содержать константы.
Parameters: /SILENT;

;Задает описание для чекбокса, который будет создан на странице завершения.
;Действителен, только, если установлен флаг Postinstall.
;Может включать константыж
Description: Запустить программу;

;Этот параметр указывает папку, из которой будет запущен файл в параметре Filename,
;если в Filename рабочая папка не указана.
;В данном случае рабочей папкой является корневая папка инсталятора.
WorkingDir: {src};

;Этот параметр служит для установки дополнительных опций запуска;
Flags:
;postinstall - Указывает инсталлятору создать задание с флажком (checkbox) на странице мастера Установка завершена.
postinstall
;nowait - Если указан этот флаг, инсталлятор не будет ждать завершения работы выполняемой программы, чтобы перейти к следующему параметру секции [Run] или завершить установку.
nowait
;unchecked - Указывает инсталлятору не ставить флажок в строке с параметром. Пользователь может его выбрать, если захочет его запустить.
unchecked

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

Dodakaedr 21-02-2014 11:02 2312909

saurn,
Цитата:

Цитата saurn
Ну я-то написал в качестве примера, думая, что основы работы в Inno вам известны »

Не совсем, я впервые пробую inno setup и поэтому много чего не ясно...

saurn 21-02-2014 11:07 2312911

Цитата:

Цитата Dodakaedr
Не совсем, я впервые пробую inno setup и поэтому много чего не ясно... »

Тогда справку читать просто необходимо. Вам и самому будет проще - каждый раз не задаватся вопросом, а зачем этот параметр, а что делает этот. Изучите азы, а потом можно переходить уже к более сложному. Пока посмотрите, как реализован запуск vbs сценария из секции Run, например, в этом примере из шапки

Dodakaedr 21-02-2014 11:09 2312913

nik1967, все равно выскакивают ошибки в разных секциях. Вот код, в чем ошибка?
Код:

[Run]
Filename: "{tmp}\11.vbs"; Parameters: "{app}\{#MyAppExeName}"; WorkingDir: "{tmp}"; Flags: nowait postinstall shellexec;


saurn 21-02-2014 11:28 2312924

Dodakaedr,
Код:

[Run]
Filename: {tmp}\11.vbs; Parameters: """{app}\{#MyAppExeName}"""; Description: Закрепить ярлык на панели задач; Flags: nowait postinstall shellexec;


Dodakaedr 21-02-2014 11:54 2312948

saurn, спс)

А почему так не работает? Решил перенести в Tasks к другим ярлыкам.
Код:

[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: quicklaunchicon7; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; MinVersion: 0,6.1

[Files]
Source: "D:\1123\Kallisto.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\1123\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\script.vbs"; DestDir: {tmp}; Flags: deleteafterinstall
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[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: "{tmp}\script.vbs"; Parameters: """{app}\{#MyAppExeName}"""; Flags: shellexec; Tasks: quicklaunchicon7

Брал с примера что вы дали.

Dodakaedr 21-02-2014 12:23 2312969

Цитата:

Цитата saurn
Что именно не работает? Ярлык не создается? »

Да

saurn 21-02-2014 12:33 2312979

Цитата:

Цитата Dodakaedr
Да »

А так?
Код:

[Run]
Filename: {tmp}\script.vbs; Parameters: """{app}\{#MyAppExeName}"""; Flags: shellexec; Tasks: quicklaunchicon7;
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent;

Поясню, где вы допустили ошибку: сценарий выполняется сверху вниз, и никак иначе. Тоесть все параметры, указаные в какой бы то нибыло секции будут выполнены в том порядке, в каком вы их задали. И так, инсталятор дошел до секции Run, где первая задача имеет флаг postinstall, тоесть должна быть выполнена после завершения установки, и ему совершенно не важно, что следующая задача, такового флага не имеет, тоесть должна быть выполнена на этапе ssPostInstall после завершения копирования файлов, создания ярлыков, папок и т.д., но до перехода на шаг ssDone. Установка завершена, инсталятор переходит на шаг ssDone и выполняет задачу с флагом postinstall, как вы ему и указали. А вот следующую в списке задачу, в вашем случае создание ярлыка, инсталятор уже не выполнит, так как она не имеет флага postinstall, и следовательно должна быть выполнена на шаге ssPostInstall, а инсталятор в этот момент уже находится на шаге ssDone. Поэтому задачи с флагами postinstall должны быть объявлены после задач, которые должны быть выполнены в процессе установки.

Dodakaedr 21-02-2014 22:13 2313387

saurn, а почему в секции tasks не создается больше двух параметров?

saurn 21-02-2014 22:20 2313392

Цитата:

Цитата Dodakaedr
а почему в секции tasks не создается больше двух параметров? »

Потому что для одной из задач, именно для задачи "Создать ярлык в панели быстрого запуска" у вас установлено условие OnlyBelowVersion: 0,6.1, тоесть только для версий винды ниже 6.1, тоесть ниже семерки. Да при установке на семерку создавать эту задачу и нет смысла, так как панели быстрого запуска из прошлых редакций в ней нет.

Dodakaedr 21-02-2014 22:35 2313404

saurn, Почему оно на расстоянии?

Код:

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "ico"; Description: "Закрепить ярлык на Панели Задач"; Flags: unchecked;


habib2302 21-02-2014 22:46 2313408

Dodakaedr,
Код:

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "ico"; Description: "Закрепить ярлык на Панели Задач"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked;

ты забыл добавить GroupDescription: "{cm:AdditionalIcons}"; во второй task

Dodakaedr 21-02-2014 22:53 2313411

habib2302, спс

habib2302 21-02-2014 22:57 2313412

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

Dodakaedr 21-02-2014 22:59 2313413

habib2302, без проблем))

habib2302 21-02-2014 23:32 2313428

народ, ответьте кто-нибудь пожалуйста на мое сообщение http://forum.oszone.net/post-2312607-2314.html

Dodakaedr 22-02-2014 00:28 2313449

Как обозначаются чекбоксы?



И правильно ли я обозначил другие пункты?

Debugger 22-02-2014 02:18 2313479

Пытаюсь сделать так:
Код:

DefaultDirName={reg:HKLM\SOFTWARE\Adobe\Photoshop\55.0,PluginPath|C:\123}
Инсталлятор прочесть из реестра не может, кажет альтернативный путь установки. Но при этом рядом есть ключ HKLM\Software\AGEIA Technologies,PhysXCore Path с ним все работает без проблем! Что за избирательность?...

Nordek 22-02-2014 02:44 2313490

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

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

[CustomMessages]
Caption=Действия
Description=Выберите действия которые вы хотите сделать.
NewButton1=Проверить версию для Internet Explorer
NewButton2=Проверить версию для Firefox, Safari, Opera
NewButton3=Запустить деинсталлятор Adobe Flash Player


[Code]
var
 
ISCustomPage1: TWizardPage;
  NewButton1, NewButton2, NewButton3: TNewButton;
  ResultCode: Integer;

procedure NewButton1Click(Sender: TObject);
begin
 
shellexec('open', ExpandConstant('{sys}\calc.exe'), '', '',SW_SHOWNORMAL, ewnowait, ResultCode)
end;

procedure NewButton2Click(Sender: TObject);
begin
 
shellexec('open', ExpandConstant('{sys}\notepad.exe'), '', '',SW_SHOWNORMAL, ewnowait, ResultCode)
end;

procedure NewButton3Click(Sender: TObject);
begin
 
shellexec('open', ExpandConstant('{sys}\cmd.exe'), '', '',SW_SHOWNORMAL, ewnowait, ResultCode)
end;



procedure InitializeWizard();
begin
 
ISCustomPage1 := CreateCustomPage(wpWelcome, CustomMessage('Caption'), CustomMessage('Description'));

  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
   
Parent := ISCustomPage1.Surface;
    Left := ScaleX(24);
    Top := ScaleY(32);
    Width := ScaleX(371);
    Height := ScaleY(33);
    Caption := CustomMessage('NewButton1');
    OnClick := @NewButton1Click;
  end;

  NewButton2 := TNewButton.Create(WizardForm);
  with NewButton2 do
  begin
   
Parent := ISCustomPage1.Surface;
    Left := ScaleX(24);
    Top := ScaleY(88);
    Width := ScaleX(371);
    Height := ScaleY(33);
    Caption := CustomMessage('NewButton2');
    OnClick := @NewButton2Click;
  end;

  NewButton3 := TNewButton.Create(WizardForm);
  with NewButton3 do
  begin
   
Parent := ISCustomPage1.Surface;
    Left := ScaleX(24);
    Top := ScaleY(136);
    Width := ScaleX(371);
    Height := ScaleY(33);
    Caption := CustomMessage('NewButton3');
    OnClick := @NewButton3Click;
  end;
end;




Dodakaedr, То что "Перезаписать значение если параметр уже существует" - это значит что если в реестре есть параметр "Kallisto", то при установке, в параметре "Kallisto" перезапишется значение "SOFTWARE\Clients\Media\Kallisto\Capabilites".
Например в "SOFTWARE\RegisteredApplications" ранее уже имеется параметр "Kallisto", а в параметре "Kallisto" значение "SOFTWARE\Clients\Media\KallistoXXX\Capabilites".
У тебя в инсталляторе, значение "SOFTWARE\Clients\Media\Kallisto\Capabilites", то при "Перезаписать значение если параметр уже существует" - заменится значение "SOFTWARE\Clients\Media\KallistoXXX\Capabilites" на "SOFTWARE\Clients\Media\Kallisto\Capabilites"

"Деинсталлировать" - это значит что при удалении программы, удалится и ключ в реестре. Далее зависит от флагов.

Цитата:

Цитата Debugger
Инсталлятор прочесть из реестра не может »

В реестре так:
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Photoshop\55.0]
"PluginPath"="C:\\Program Files\\Adobe\\Photoshop"

???

Dodakaedr 22-02-2014 09:04 2313514

Nordek, То что они означают я знаю, вопрос в том как их прописать в inno setup?

habib2302 22-02-2014 10:00 2313533

как сделать чтобы версия определялась через реестр и появлялся диалог с версией т.е как у D!akov'а

и как перед установкой распаковать файлы во временную папку {tmp}

Debugger 22-02-2014 10:21 2313540

Nordek, именно так, и есть еще одноименный раздел:
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Photoshop\55.0]
"PluginPath"="C:\\Program Files\\Adobe\\Adobe Photoshop CS5.1 (64 Bit)\\Plug-Ins"

[HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Photoshop\55.0\PluginPath]
@="C:\\Program Files\\Adobe\\Adobe Photoshop CS5.1 (64 Bit)\\Plug-Ins\\"

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

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

UsePreviousAppDir=False
EnableDirDoesntExistWarning=True
DirExistsWarning=yes
AppendDefaultDirName=False

у меня вообще ничего не работало, даже ключ от AGEIA.

И еще вопрос - когда гуглил вопрос, многие делают то же самое, но через код на Паскале. Есть какие-то различия, или каждый делает как ему удобнее?

El Sanchez 22-02-2014 12:51 2313582

Цитата:

Цитата Debugger
Инсталлятор прочесть из реестра не может, кажет альтернативный путь установки. Но при этом рядом есть ключ HKLM\Software\AGEIA Technologies,PhysXCore Path с ним все работает без проблем! Что за избирательность? »

Debugger, по умолчанию инсталлятор работает в 32-разрядном режиме, поэтому все обращения к 64-разрядным разделам реестра и системным директориям перенаправляются в их 32-разрядные аналоги. Либо переводите инсталлятор в 64-разрядный режим установкой директивы ArchitecturesInstallIn64BitMode=x64, либо обращайтесь к 64-разрядному разделу как к 64-разрядному: DefaultDirName={reg:HKLM64\SOFTWARE\Adobe\Photoshop\55.0,PluginPath|C:\123}

saurn 22-02-2014 14:25 2313630

Цитата:

Цитата habib2302
как сделать чтобы версия определялась через реестр и появлялся диалог с версией »

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

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

[CustomMessages]
Caption=Действия
Description=Выберите действия которые вы хотите сделать.
NewButton1=Проверить версию для Internet Explorer
NewButton2=Проверить версию для Firefox, Safari, Opera
NewButton3=Запустить деинсталлятор Adobe Flash Player


[Code]
var
 
ISCustomPage1: TWizardPage;
  NewButton1, NewButton2, NewButton3: TNewButton;
  ResultCode: Integer;
  lpBuff: String;

procedure NewButton1Click(Sender: TObject);
begin
    if
RegQueryStringValue(HKLM, 'SOFTWARE\Macromedia\FlashPlayerActiveX', 'Version', lpBuff) then
   
MsgBox('Установлена версия для Internet Explorer:' + StringOfChar(#32,2) + lpBuff, mbInformation, MB_OK);
end;

procedure NewButton2Click(Sender: TObject);
begin
    if
RegQueryStringValue(HKLM, 'SOFTWARE\Macromedia\FlashPlayerPlugin', 'Version', lpBuff) then
   
MsgBox('Установлена версия для Firefox, Safari, Opera:' + StringOfChar(#32,2) + lpBuff, mbInformation, MB_OK);
end;

procedure NewButton3Click(Sender: TObject);
begin
 
shellexec('open', ExpandConstant('{sys}\cmd.exe'), '', '',SW_SHOWNORMAL, ewnowait, ResultCode)
end;



procedure InitializeWizard();
begin
 
ISCustomPage1 := CreateCustomPage(wpWelcome, CustomMessage('Caption'), CustomMessage('Description'));

  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
   
Parent := ISCustomPage1.Surface;
    Left := ScaleX(24);
    Top := ScaleY(32);
    Width := ScaleX(371);
    Height := ScaleY(33);
    Caption := CustomMessage('NewButton1');
    OnClick := @NewButton1Click;
  end;

  NewButton2 := TNewButton.Create(WizardForm);
  with NewButton2 do
  begin
   
Parent := ISCustomPage1.Surface;
    Left := ScaleX(24);
    Top := ScaleY(88);
    Width := ScaleX(371);
    Height := ScaleY(33);
    Caption := CustomMessage('NewButton2');
    OnClick := @NewButton2Click;
  end;

  NewButton3 := TNewButton.Create(WizardForm);
  with NewButton3 do
  begin
   
Parent := ISCustomPage1.Surface;
    Left := ScaleX(24);
    Top := ScaleY(136);
    Width := ScaleX(371);
    Height := ScaleY(33);
    Caption := CustomMessage('NewButton3');
    OnClick := @NewButton3Click;
  end;
end;



Цитата:

Цитата Dodakaedr
вопрос в том как их прописать в inno setup? »

Код:

[Registry]
Root: HKLM; Subkey: SOFTWARE\RegisteredApplications; ValueType: string; ValueName: Kallisto; ValueData: SOFTWARE\Clients\Media\Kallisto\Capabilites; Flags: deletevalue uninsdeletevalue


habib2302 22-02-2014 15:06 2313649

и как перед установкой распаковать деинсталлятор для adobe flash player во временную папку {tmp}

Debugger 22-02-2014 15:10 2313653

El Sanchez, да, все работает. Я проверял HKLM64, но ДО того как выставлял директивы указанные в предыдущем посте. Спасибо!
Почему же работает соседняя ветка?

Nordek 22-02-2014 15:40 2313666

Dodakaedr,

Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\RegisteredApplications; ValueType: string; ValueName: Kallisto; ValueData: SOFTWARE\Clients\Media\Kallisto\Capabilites0; Flags: uninsdeletevalue

По первому, насчёт перезаписи - то по умолчанию и так будет перезаписано.
А по второму, достаточно будет одного флага uninsdeletevalue - т.е в "RegisteredApplications" удалит параметр "Kallisto" со значением, но не затронет сам раздел "RegisteredApplications (SOFTWARE\RegisteredApplications) - т.к в нём могут иметься другие параметры от других программ".

Цитата:

Цитата habib2302
и как перед установкой распаковать деинсталлятор для adobe flash player во временную папку {tmp} »

Код:

ExtractTemporaryFile('install_flash_player_ax.exe');
ExtractTemporaryFile('install_flash_player.exe');
ExtractTemporaryFile('uninstall_flash_player.exe');


El Sanchez 22-02-2014 16:43 2313701

Цитата:

Цитата Debugger
Я проверял HKLM64, но ДО того как выставлял директивы указанные в предыдущем посте »

Debugger, указание HKLM64 достаточно в вашем случае для 32-разрядного режима работы инсталлятора, нет необходимости одновременно еще и директиву ArchitecturesInstallIn64BitMode применять.
Цитата:

Цитата Debugger
Почему же работает соседняя ветка? »

Debugger, потому что в 32-разрядном аналоге раздела реестра эта запись тоже есть.
P.S. Тут, тут, тут и тут по теме.

Dodakaedr 22-02-2014 18:35 2313766

Есть способ изменить цвет текста при включенном Transparent?

innot20 22-02-2014 18:53 2313777

Возможно ли распаковать архив pkg ? в определённую папочку

Nordek 22-02-2014 20:22 2313811

Цитата:

Цитата Dodakaedr
Есть способ изменить цвет текста »

Код:

Font.Color:=$FF0000;

Dodakaedr 22-02-2014 20:33 2313815

Nordek, это при включенной прозрачности?



Код:

with WizardForm.PageDescriptionLabel do
  begin
    Color := clMenuText;
    Font.Color := clBlue;
    ParentColor := False;
    ParentFont := False;
    OnClick := @PageDescriptionLabelClick;
    Transparent := True;
    Left := ScaleX(0);
    Top := ScaleY(23);
    Width := ScaleX(261);
  end;


vint56 22-02-2014 21:15 2313840

Dodakaedr там есть font + разверни
Font.Height := -12; а большую картинку под спойлер

Dodakaedr 22-02-2014 21:21 2313844

Цитата:

Цитата vint56
там есть font + разверни
Font.Height := -12; »

Не меняет цвет, меняет высоту....

vint56 22-02-2014 21:27 2313853

Dodakaedr
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[code]
procedure InitializeWizard();
begin
with WizardForm.PageDescriptionLabel do
begin
Font.Color := clRed;
end;
with WizardForm.PageNameLabel do
begin
Font.Color := clLime;
end;
end;

Dodakaedr 22-02-2014 21:32 2313860

vint56, не то. нужно поменять цвет текста при включенной прозрачности. посмотрите на скрин

saurn 22-02-2014 21:32 2313861

Dodakaedr, шрифт контролов TNewStaticText при включении прозрачности фона лишается свойства Color. Как вариант, можно использовать свои контролы TLabel.

Dodakaedr 22-02-2014 21:32 2313864

saurn, а можно по подробней?

vint56 22-02-2014 21:35 2313869

Dodakaedr у простого лэйбала тоже есть параметр празрачности Transparent := True;

читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
Label1: TLabel;

procedure InitializeWizard();
begin
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Transparent := True;
Parent := WizardForm.SelectDirPage;
Caption := 'Dodakaedr';
Font.Color := clRed;
Font.Height := -16;
Font.Name := 'Tahoma';
Font.Style := [fsBold];
ParentFont := False;
Left := ScaleX(152);
Top := ScaleY(136);
Width := ScaleX(113);
Height := ScaleY(19);
end;
end;

Dodakaedr 22-02-2014 21:41 2313876

vint56, оно, только надо вместо NewStaticText1, а он заблокирован. Как быть?

vint56 22-02-2014 21:53 2313882

Dodakaedr
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
DestName: "WizardForm.BitmapImage1.bmp"; Source: "E:\Картинки\mostkorol2_1024.bmp"; Flags: dontcopy solidbreak

[code]
var
Panel1: TPanel;
BitmapImage1: TBitmapImage;
Label1: TLabel;
Label2: TLabel;

procedure InitializeWizard();
begin
WizardForm.MainPanel.Hide;
{ Panel1 }
Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
Parent := WizardForm.InnerPage;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(499);
Height := ScaleY(57);
BevelOuter := bvNone;
end;
{ BitmapImage1 }
BitmapImage1 := TBitmapImage.Create(WizardForm);
with BitmapImage1 do
begin
Parent := Panel1;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(497);
Height := ScaleY(57);
ExtractTemporaryFile('WizardForm.BitmapImage1.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardForm.BitmapImage1.bmp'));
end;
{ Label1 }
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Parent := Panel1;
Caption := 'Выбор папки установки';
Font.Color := clWhite;
Font.Height := -12;
Font.Name := 'Tahoma';
Font.Style := [];
ParentFont := False;
Left := ScaleX(16);
Top := ScaleY(8);
Width := ScaleX(134);
Height := ScaleY(14);
end;
{ Label2 }
Label2 := TLabel.Create(WizardForm);
with Label2 do
begin
Parent := Panel1;
Caption := 'В какую папку вы хотите установить {#SetupSetting("AppName")}?';
Font.Color := clWhite;
Font.Height := -12;
Font.Name := 'Tahoma';
Font.Style := [];
ParentFont := False;
Left := ScaleX(24);
Top := ScaleY(24);
Width := ScaleX(385);
Height := ScaleY(14);
end;
end;

Вот обновленый пример
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
DestName: "WizardForm.BitmapImage1.bmp"; Source: "E:\Картинки\mostkorol2_1024.bmp"; Flags: dontcopy solidbreak

[code]
var
PageNameLabel, PageDescriptionLabel: TLabel;
MainPanel: TPanel;
BitmapImage: TBitmapImage;
procedure InitializeWizard();
begin
WizardForm.MainPanel.Hide;
MainPanel := TPanel.Create(WizardForm);
with MainPanel do
begin
Parent := WizardForm.InnerPage;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(499);
Height := ScaleY(57);
BevelOuter := bvNone;
end;
BitmapImage := TBitmapImage.Create(WizardForm);
with BitmapImage do
begin
Parent := MainPanel;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(497);
Height := ScaleY(57);
ExtractTemporaryFile('WizardForm.BitmapImage1.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardForm.BitmapImage1.bmp'));
end;
PageNameLabel:=TLabel.Create(WizardForm);
with PageNameLabel do begin
AutoSize:=False;
SetBounds(ScaleX(24), ScaleY(10), ScaleX(400), ScaleY(30));
Transparent:=True;
Font.Name:= 'Georgia';
Font.Size:= 8;
Font.Color:=clWhite;;
Parent:=MainPanel;
end;
PageDescriptionLabel:=TLabel.Create(WizardForm);
with PageDescriptionLabel do begin
AutoSize:=False;
SetBounds(ScaleX(40), ScaleY(26), ScaleX(389), ScaleY(50));
Wordwrap:= True;
Transparent:=True;
Font.Name:= 'Georgia';
Font.Size:= 8;
Font.Color:=clWhite;;
Parent:=MainPanel;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption:=WizardForm.PageNameLabel.Caption
PageDescriptionLabel.Caption:=WizardForm.PageDescriptionLabel.Caption
end;


а можно чтобы только текст менялся без картинки

читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
PageNameLabel, PageDescriptionLabel: TLabel;
MainPanel: TPanel;
BitmapImage: TBitmapImage;
procedure InitializeWizard();
begin
WizardForm.MainPanel.Hide;
MainPanel := TPanel.Create(WizardForm);
with MainPanel do
begin
Parent := WizardForm.InnerPage;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(499);
Height := ScaleY(57);
BevelOuter := bvNone;
end;
PageNameLabel:=TLabel.Create(WizardForm);
with PageNameLabel do begin
AutoSize:=False;
SetBounds(ScaleX(24), ScaleY(10), ScaleX(400), ScaleY(30));
Transparent:=True;
Font.Name:= 'Georgia';
Font.Size:= 8;
Font.Color:=$000000;
Parent:=MainPanel;
end;
PageDescriptionLabel:=TLabel.Create(WizardForm);
with PageDescriptionLabel do begin
AutoSize:=False;
SetBounds(ScaleX(40), ScaleY(26), ScaleX(389), ScaleY(50));
Wordwrap:= True;
Transparent:=True;
Font.Name:= 'Georgia';
Font.Size:= 8;
Font.Color:=$000000;
Parent:=MainPanel;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption:=WizardForm.PageNameLabel.Caption
PageDescriptionLabel.Caption:=WizardForm.PageDescriptionLabel.Caption
end;

Dodakaedr 22-02-2014 22:13 2313893

vint56, а можно чтобы только текст менялся без картинки?

Dodakaedr 22-02-2014 22:36 2313912

vint56, тоисть чтобы картинка оставалась а текст менялся...

Nordek 22-02-2014 22:42 2313917

vint56, Код, лучше захватывать в тег [Code][/Code] - при вставке кода в скрипт имеются пробелы. А у тех кто использует ISTool, будут проблемы - пробелы превращаются в знак равенства "=":
читать дальше »
Код:

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

[Files]=
DestName: "WizardForm.BitmapImage1.bmp"; Source: "E:\Картинки\mostkorol2_1024.bmp"; Flags: dontcopy solidbreak=

[code]=
var=
PageNameLabel, PageDescriptionLabel: TLabel;=
MainPanel: TPanel;=
BitmapImage: TBitmapImage;=
procedure InitializeWizard();=
begin=
WizardForm.MainPanel.Hide;=
MainPanel :=TPanel.Create(WizardForm);
with MainPanel do=
begin=
Parent :=WizardForm.InnerPage;
Left :=ScaleX(0);
Top :=ScaleY(0);
Width :=ScaleX(499);
Height :=ScaleY(57);
BevelOuter :=bvNone;
end;=
BitmapImage :=TBitmapImage.Create(WizardForm);
with BitmapImage do=
begin=
Parent :=MainPanel;
Left :=ScaleX(0);
Top :=ScaleY(0);
Width :=ScaleX(497);
Height :=ScaleY(57);
ExtractTemporaryFile('WizardForm.BitmapImage1.bmp');=
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardForm.BitmapImage1.bmp'));=
end;=
PageNameLabel:=TLabel.Create(WizardForm);
with PageNameLabel do begin=
AutoSize:=False;
SetBounds(ScaleX(24), ScaleY(10), ScaleX(400), ScaleY(30));=
Transparent:=True;
Font.Name:='Georgia';
Font.Size:=8;
Font.Color:=clWhite;;
Parent:=MainPanel;
end;=
PageDescriptionLabel:=TLabel.Create(WizardForm);
with PageDescriptionLabel do begin=
AutoSize:=False;
SetBounds(ScaleX(40), ScaleY(26), ScaleX(389), ScaleY(50));=
Wordwrap:=True;
Transparent:=True;
Font.Name:='Georgia';
Font.Size:=8;
Font.Color:=clWhite;;
Parent:=MainPanel;
end;=
end;=

procedure CurPageChanged(CurPageID: Integer);=
begin=
PageNameLabel.Caption:=WizardForm.PageNameLabel.Caption
PageDescriptionLabel.Caption:=WizardForm.PageDescriptionLabel.Caption
end;=


vint56 22-02-2014 22:47 2313919

Nordek Понял учту
Dodakaedr
Код:

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

[Files]
DestName: "WizardForm.BitmapImage1.bmp"; Source: "E:\Картинки\mostkorol2_1024.bmp"; Flags: dontcopy solidbreak

[code ]
var
  PageNameLabel, PageDescriptionLabel: TLabel;
  MainPanel: TPanel;
  BitmapImage: TBitmapImage;
procedure InitializeWizard();
begin
  WizardForm.MainPanel.Hide;
  MainPanel := TPanel.Create(WizardForm);
  with MainPanel do
  begin
    Parent := WizardForm.InnerPage;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(499);
    Height := ScaleY(57);
    BevelOuter := bvNone;
  end;
  BitmapImage := TBitmapImage.Create(WizardForm);
  with BitmapImage do
  begin
    Parent := MainPanel;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(497);
    Height := ScaleY(57);
    ExtractTemporaryFile('WizardForm.BitmapImage1.bmp');
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardForm.BitmapImage1.bmp'));
  end;
  PageNameLabel:=TLabel.Create(WizardForm);
  with PageNameLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(24), ScaleY(10), ScaleX(400), ScaleY(30));
    Transparent:=True;
    Font.Name:= 'Georgia';
    Font.Size:= 8;
    Font.Color:=clWhite;;
    Parent:=MainPanel;
  end;
  PageDescriptionLabel:=TLabel.Create(WizardForm);
  with PageDescriptionLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(40), ScaleY(26), ScaleX(389), ScaleY(50));
    Wordwrap:= True;
    Transparent:=True;
    Font.Name:= 'Georgia';
    Font.Size:= 8;
    Font.Color:=clWhite;;
    Parent:=MainPanel;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  PageNameLabel.Caption:=WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption:=WizardForm.PageDescriptionLabel.Caption;

  case CurPageID of
  wpSelectDir:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpSelectComponents:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpSelectProgramGroup:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpSelectTasks:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpReady:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpPreparing:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpInstalling:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpInfoAfter:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
 end;
end;


Dodakaedr 22-02-2014 22:52 2313921

vint56, Огромное спасибо!!!

vint56, а обязательно надо менять полностью main panel?

Dodakaedr 22-02-2014 23:12 2313934

vint56, надо чтобы сохранялась процедура procedure RedesignWizardForm; но при этом чтобы поменялся текст. Можно такое сделать?

vint56 22-02-2014 23:12 2313935

Dodakaedr нет но тогда придётся скрывать другие элементы что находятся на стандартном WizardForm.MainPanel потому мне было проше

Код:

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

[Files]
DestName: "WizardForm.BitmapImage1.bmp"; Source: "E:\Картинки\mostkorol2_1024.bmp"; Flags: dontcopy solidbreak

[code ]
var
  PageNameLabel, PageDescriptionLabel: TLabel;
  BitmapImage: TBitmapImage;

procedure InitializeWizard();
begin
  RedesignWizardForm;// Вот так
  BitmapImage := TBitmapImage.Create(WizardForm);
  with BitmapImage do
  begin
    Parent := WizardForm.MainPanel;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(497);
    Height := ScaleY(57);
    ExtractTemporaryFile('WizardForm.BitmapImage1.bmp');
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardForm.BitmapImage1.bmp'));
  end;
  PageNameLabel:=TLabel.Create(WizardForm);
  with PageNameLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(24), ScaleY(10), ScaleX(400), ScaleY(30));
    Transparent:=True;
    Font.Name:= 'Georgia';
    Font.Size:= 8;
    Font.Color:=clWhite;;
    Parent:=WizardForm.MainPanel;
  end;
  PageDescriptionLabel:=TLabel.Create(WizardForm);
  with PageDescriptionLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(40), ScaleY(26), ScaleX(389), ScaleY(50));
    Wordwrap:= True;
    Transparent:=True;
    Font.Name:= 'Georgia';
    Font.Size:= 8;
    Font.Color:=clWhite;;
    Parent:=WizardForm.MainPanel;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin

  WizardForm.PageNameLabel.Hide;
  WizardForm.PageDescriptionLabel.Hide;
  WizardForm.WizardSmallBitmapImage.Hide;
  PageNameLabel.Caption:=WizardForm.PageNameLabel.Caption;
  PageDescriptionLabel.Caption:=WizardForm.PageDescriptionLabel.Caption;

  case CurPageID of
  wpSelectDir:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpSelectComponents:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpSelectProgramGroup:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpSelectTasks:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpReady:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpPreparing:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpInstalling:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
  wpInfoAfter:
  begin
    PageNameLabel.Caption:='Мой текст';
    PageDescriptionLabel.Caption:='Мой текст';
  end;
 end;
end;


habib2302 22-02-2014 23:21 2313939

как скрыть FilenameLabel

Dodakaedr 22-02-2014 23:22 2313940

Цитата:

Цитата vint56
нет но тогда придётся скрывать другие элементы что находятся на стандартном WizardForm.MainPanel потому мне было проше »

Теперь именно то что мне нужно)) Спс!

vint56 22-02-2014 23:23 2313941

habib2302
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.FilenameLabel.Hide;
end;

Dodakaedr 23-02-2014 01:45 2313996

Правильно записано?
Код:

Root: HKLM; SubKey: SOFTWARE\Classes\Directory\shell\Kallisto.enqueue\command; ValueType: string; ValueData: "{app}\{#MyAppExeName} /add ""%1"""; Flags: uninsdeletevalue uninsdeletekeyifempty

Dodakaedr 23-02-2014 02:45 2314020

Можно как-то сделать чтобы восстанавливалась предыдущая ассоциация файлов после удаления моей программы?

Как это исправить?


Пробовал Permissions: users-full и Permissions: users-modify не помогает.

borune 23-02-2014 16:06 2314253

день добрый!

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

Dodakaedr 23-02-2014 16:25 2314263

borune,
Код:

[UninstallDelete]
Type: filesandordirs; Name: "путь к папке"

Type (Обязательно)
Указывает тип удаляемого объекта. Может быть следующим:

files
Параметр Name указывает имя отдельного файла или маску.

filesandordirs
Функции те же, что и у files за исключением, что также может задавать имя папки, в этом случае удаляются все ее файлы и подпапки.

dirifempty
При использовании этого типа параметр Name должен задавать папку, но не содержать масок. Папка будет удалена только если она пустая.

borune 23-02-2014 19:58 2314412

Цитата:

Цитата Dodakaedr
[UninstallDelete] Type: filesandordirs; Name: "путь к папке" »

Cпасибо, но мне нужно удалять из раздела [code]. Сделал чере DelTree.

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

Нашел, как задавать иконку программе через IconFilename, но он во-первых требует внешнего файла с расширением .ico, а во-вторых делает у всех окон одинаковые иконки.

innot20 23-02-2014 22:51 2314490

Здравствуйте, подскажите пожалуйста как создать копию папки

Dodakaedr 24-02-2014 23:10 2315065

Почему №1 ассоциирует, а №2 нет? Какая между ними разница?

№1)


№2

Gnom_aka_Lexander 25-02-2014 08:16 2315204

Dodakaedr, либо в первой строчке valuedata указать mp3file, либо в остальных обрабатывать Kallisto.mp3.
И да, первая тоже не должна ассоциировать, если нигде больше не определяется расширение .mp3

Nordek 25-02-2014 09:01 2315215

Dodakaedr, В разделе HKEY_CLASSES_ROOT лучше не менять ассоциацию.
Лучше так:
Код:

[Registry]
Root: HKCU; Subkey: Software\Classes\.mp3; ValueType: string; ValueName: ; ValueData: Kallisto.enqueue; Flags: uninsdeletevalue
Root: HKCU; Subkey: Software\Classes\Kallisto.enqueue\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Kallisto.dll,2; Flags: uninsdeletevalue
Root: HKCU; Subkey: Software\Classes\Kallisto.enqueue\shell\open\command; ValueType: string; ValueName: ; ValueData: "{app}\Kallisto.exe ""%1"""; Flags: uninsdeletevalue

Или так:
Код:

[Registry]
Root: HKLM; Subkey: Software\Classes\.mp3; ValueType: string; ValueName: ; ValueData: Kallisto.enqueue; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\Classes\Kallisto.enqueue\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Kallisto.dll,2; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\Classes\Kallisto.enqueue\shell\open\command; ValueType: string; ValueName: ; ValueData: "{app}\Kallisto.exe ""%1"""; Flags: uninsdeletevalue

P.S

Dodakaedr 25-02-2014 12:25 2315317

Gnom_aka_Lexander, да, разобрался ошибка была в значении kallisto.mp3

Nordek,У кого больше преимущества HKCR или HKLM?

Nordek 25-02-2014 13:29 2315358

Цитата:

Цитата Dodakaedr
У кого больше преимущества HKCR или HKLM? »

Код:

HKCR - HKEY_CLASSES_ROOT: Действует как для текущего пользователя, так и для всех.
HKCU - HKEY_CURRENT_USER:  Для текущего пользователя
HKLM - HKEY_LOCAL_MACHINE: Для всех пользователей

Что касается HKEY_CLASSES_ROOT - если что пойдёт не так, то можно и вовсе значительно угробить ассоциацию (Проклинать будут долго).

Shkutu 25-02-2014 14:57 2315435

Доброго времени суток! Подскажите плиз, как можно у страницы типа TInputDirWizardPage отключить ворнинг о том, что папка не выбрана?

Dodakaedr 25-02-2014 20:19 2315626

Nordek, спс

Johny777 27-02-2014 02:23 2316440

Shkutu, перехват функции WinApi (хук). В данном случае MessageBox(W/A). Думаю по другому никак если так уж надо скрыть.

но на мой взгляд самое простое - создать пустую страницу и на ней в ручную эдит и остальное и не извращаться с вышесказанным

Debugger 27-02-2014 07:26 2316485

Покурил мануал и нашел все описания встроенных функций в паскаль-коде. Получается для того, чтобы научиться писать паскаль-код для Inno Setup, вполне достаточно знать эти функции, описанные в хелпе и знать синтаксис языка? Сначала думал что придется учить Паскаль с нуля... Поправьте если не прав!

Shkutu 27-02-2014 13:05 2316641

Johny777, спасиб. В общем-то, так и сделала - свою страницу с нужными конторолами, когда поняла, что просто так скрыть ворнинг нельзя.
Debugger, для каких-то стандартных вещей вполне хватает мануала и основ паскаля. Иногда конечно требуется что-то более сложное, вроде того же WinApi, но на мой вкус это скорее исключение (не знаю, как у других).

dr.alexa2000@vk 27-02-2014 15:48 2316774

Не могу запаковать папку с названием {Original}, ругается на знак { , что делать?

Nordek 27-02-2014 16:58 2316832

Цитата:

Цитата dr.alexa2000@vk
Не могу запаковать папку с названием {Original}, ругается на знак { , что делать? »

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

Всё пакуется нормально:
Код:

[Files]
Source: {Original}\*; DestDir: {app}\; Flags: ignoreversion recursesubdirs createallsubdirs

Код:

[Files]
Source: {Original}\*; DestDir: {app}\{{Original}; Flags: ignoreversion recursesubdirs createallsubdirs


Dodakaedr 27-02-2014 17:08 2316842

Как добавить программу в исключения брандмауэра windows?

Nordek 27-02-2014 17:18 2316850

Цитата:

Цитата Dodakaedr
Как добавить программу в исключения брандмауэра windows? »

Смотри здесь.

Dodakaedr 27-02-2014 17:36 2316865

Nordek, как это оформить в секции tasks?

Shkutu 27-02-2014 18:03 2316879

Цитата:

Цитата Dodakaedr
добавить программу в исключения брандмауэра windows? »

вот так можно
читать дальше »

[code]
[CustomMessages]
ru.FireWallAllow=Программа установки добавит %1 в исключения брандмауэра Windows на текущем профиле (%2). Хотите продолжить?
en.FireWallAllow=Setup will now add %1 to Windows Firewall as an authorized application for the current profile (%2). Do you want to continue?

ru.FireWallAllowOk=Программа установки добавила %1 в исключения брандмауэра Windows на текущем профиле.
en.FireWallAllowOk=Setup is now an authorized application %1 for the current profile

Код:

const
  NET_FW_IP_VERSION_ANY = 2;
  NET_FW_SCOPE_ALL = 0;

procedure AddFirewall(Name,AppName:string);
var
  Firewall, Application: Variant;
begin

  if MsgBox(ExpandConstant('{cm:FireWallAllow,'+AppName+','+GetUserNameString+'}'), mbInformation, mb_YesNo) = idNo then
    Exit;

  { Create the main Windows Firewall COM Automation object }

  try
    Firewall := CreateOleObject('HNetCfg.FwMgr');
  except
    RaiseException('Please install Windows Firewall first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');
  end;

  { Add the authorization }

  Application := CreateOleObject('HNetCfg.FwAuthorizedApplication');
  Application.Name := Name; //Название записи о разрешении
  Application.IPVersion := NET_FW_IP_VERSION_ANY;
  Application.ProcessImageFileName := AppName;//ExpandConstant('{srcexe}'); //Собственно программа
  Application.Scope := NET_FW_SCOPE_ALL;
  Application.Enabled := True;

  Firewall.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(Application);
  MsgBox(ExpandConstant('{cm:FireWallAllowOk,'+AppName+'}'), mbInformation, mb_Ok);

end;

function AddToFireWall(param:string):boolean;
begin
result:=false;
if IsComponentSelected('app1') then
  AddFirewall('App 1', ExpandConstant('{app}\app1.exe'));
end;

[Run]
Filename:'';Flags: nowait; Check: AddToFireWall('setup')


Dodakaedr 27-02-2014 18:10 2316883

Shkutu, что-то ваш код не работает. Не выскакивает окошко и не добавляет.

Shkutu 27-02-2014 19:07 2316901

Dodakaedr, у меня работает, выковыривала из рабочего скрипта. Может криво скопипастила, но что у вас не работает, надо смотреть уже на вашем коде.
А вообще посмотрите стандартный пример CodeAutomation.iis (в обычном инно входят в стандартный комплект, лежит в папке Examples).

diman_21Ru 27-02-2014 21:25 2316914

Всем привет , как можно наложить на кнопки звуки , за ответ заранее благодарю .

Ivan_009 27-02-2014 22:01 2316927

Покажите пожалуйста пример блокировки наложенной через ботву кнопки при нехватке места на диске...

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

saurn 27-02-2014 22:03 2316930

Цитата:

Цитата Dodakaedr
Как добавить программу в исключения брандмауэра windows? »

Цитата:

Цитата Dodakaedr
как это оформить в секции tasks? »

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

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program


[Files]
Source: MyProg.exe; DestDir: {app};


[Tasks]
Name: frexp; Description: Добавить исключение в брандмауэр Windows;


[code]
const
   
NET_FW_SCOPE_ALL      = 0;
    NET_FW_IP_VERSION_ANY = 2;


procedure SetFirewallException(const AppName, FileName: String);
var
   
FirewallObject: Variant;
    FirewallManager: Variant;
    FirewallProfile: Variant;
begin
    try
       
FirewallObject := CreateOleObject('HNetCfg.FwAuthorizedApplication');
        FirewallObject.ProcessImageFileName := FileName;
        FirewallObject.Name := AppName;
        FirewallObject.Scope := NET_FW_SCOPE_ALL;
        FirewallObject.IpVersion := NET_FW_IP_VERSION_ANY;
        FirewallObject.Enabled := True;
        FirewallManager := CreateOleObject('HNetCfg.FwMgr');
        FirewallProfile := FirewallManager.LocalPolicy.CurrentProfile;
        FirewallProfile.AuthorizedApplications.Add(FirewallObject);
    except end;
end;


procedure RemoveFirewallException(const FileName: String );
var
   
FirewallManager: Variant;
    FirewallProfile: Variant;
begin
    try
       
FirewallManager := CreateOleObject('HNetCfg.FwMgr');
        FirewallProfile := FirewallManager.LocalPolicy.CurrentProfile;
        FireWallProfile.AuthorizedApplications.Remove(FileName);
    except end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case
CurStep of
       
ssPostInstall: if IsTaskSelected('frexp') then SetFirewallException('My Program', ExpandConstant('{app}') + '\MyProg.exe');
    end;
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case
CurUninstallStep of
       
usPostUninstall: RemoveFirewallException(ExpandConstant('{app}') + '\MyProg.exe');
    end;
end;


Ivan_009 27-02-2014 22:04 2316931

diman_21Ru, Так:

Dodakaedr 27-02-2014 22:26 2316941

saurn, Огромное спасибо!!!

dr.alexa2000@vk 28-02-2014 11:46 2317175

Цитата:

Цитата Nordek
Всё пакуется нормально »

Странно.У меня нет.
Код:

Source: "{app}\HD3_Data\Templates\{{Original}\patcher_x86 dump.txt"; DestDir: {app}\HD3_Data\Templates\{{Original}; MinVersion: 0.0,5.0; Flags: ignoreversion
Source: "{app}\HD3_Data\Templates\{{Original}\patcher_x86 log.txt"; DestDir: {app}\HD3_Data\Templates\{{Original}; MinVersion: 0.0,5.0; Flags: ignoreversion
Source: "{app}\HD3_Data\Templates\{{Original}\rmg.txt"; DestDir: {app}\HD3_Data\Templates\{{Original}; MinVersion: 0.0,5.0; Flags: ignoreversion

Объясняю ситуацию:есть Герои 3 HD их надо запаковать, но есть папка в которой хранятся оригинальные файлы , называется она {Original}.Выходит ошибка, т.к. эти скобки {} мешают правильно понять название папки.

Debugger 28-02-2014 12:11 2317187

Подскажите, а можно ли передать в функцию какой-либо параметр?
Чтото типа наподобие этого:
Код:

[Components]
Name: "plugin"; Description: "plugin";
Name: "plugin\32-bit"; Description: "Plugin for productname v1.0"; Check: "checkversion32(10)"
Name: "plugin\64-bit"; Description: "plugin for productname v1.0"; Check: "checkversion64(10)"
Name: "plugin\32-bit"; Description: "Plugin for productname v2.0"; Check: "checkversion32(20)"
Name: "plugin\64-bit"; Description: "plugin for productname v2.0"; Check: "checkversion64(20)"
Name: "plugin\32-bit"; Description: "Plugin for productname v3.0"; Check: "checkversion32(30)"
Name: "plugin\64-bit"; Description: "plugin for productname v3.0"; Check: "checkversion64(30)"

[code]
function checkversion32(параметр): Boolean;
  begin
    Result := RegValueExists(HKLM, 'SOFTWARE\параметр\productname', 'version')   
  end;

function checkversion64(параметр): Boolean;
  begin
    Result := RegValueExists(HKLM64, 'SOFTWARE\параметр\productname', 'version')   
  end;


Shkutu 28-02-2014 12:31 2317194

Debugger, можно, читаем справку про Check parameters
Код:

[Files]
Source: "A\MYFILE.TXT"; DestDir: "{app}"; Check: MyDirCheck(ExpandConstant('{app}\A'))
Source: "B\MYFILE.TXT"; DestDir: "{app}"; Check: DirExists(ExpandConstant('{app}\B'))

 [Codе]
function MyDirCheck(DirName: String): Boolean;
begin
  Result := DirExists(DirName);
end;


innot20 28-02-2014 20:52 2317470

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

прогресс бар починил, но с компонентами никак
http://rghost.ru/52720578

Debugger 01-03-2014 10:00 2317603

innot20, покажите часть кода, который, как вы думаете не работает.

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

innot20 01-03-2014 11:21 2317624

Цитата:

Цитата Debugger
innot20, покажите часть кода, который, как вы думаете не работает.
Код ваш скачал, но отладить его трудновато, много чего не хватает, а загонять в комментарии неработающие строки то еще удовольствие. »

Вы уж меня простите, но я не представляю где ошибка, если включить InnerNotebook и OuterNotebook, то компоненты выводятся, но на всех страницах

Продолжаю копаться, ничего не получается
Уже пошёл метод извращения

borune 01-03-2014 17:15 2317766

Ребят, а вот скажите пожалуйста, вопрос с правами. Я, например, хочу, чтоб программа устанавливалась в Program Files. Сделал, установил, все норм. Но норм только если установка осуществляется с админского аккаунта. Я же хочу сделать, чтоб любой пользователь мог устанавливать программу. Для этого в секцию [Setup] дописал:
Код:

PrivilegesRequired=none
Если этого не сделать, то юзер вообще не сможет запустить установку. С этим же параметром она запускается, но на этапе копирования файлов установщик вылетает с ошибкой 5: access denied. Оно вроде бы как понятно, ведь обычный юзер не имеет прав на изменение содержимого папки Programm Files. Но тогда получается, что он вообще ни одной программы туда установить не может, однако это ведь не так..какой-нибудь пунто свитчер замечательно устанавливается из-под обычного юзера в pf. Подскажите, что надо дописать и куда, чтоб инсталлятор не смотрел на то, из-под какого аккаунта его запускают?

Farser21 01-03-2014 23:57 2317875

Всем привет, возможно как-то вывести окно компонентов со своим размером и координатами через скрипт а не через Дизайнер диалогов.

urus_vp 02-03-2014 00:52 2317900

Приветствую!

простая установка, все через Визард создано, за исключением добавления:
PrivilegesRequired=none

один Exe и подкаталог Data с файловой БД.

после установки, программа запускается только при явном указании Run As Administrator.

при этом если просто скопировать содержимое папки из Program Files в любую иную папку вне этого каталог, то всё запускается на ура.

Что ещё надо прописать и где? подскажите плиз! а то на след.неделе надо отсылать заказчику... :(

вот нашел ссылку по теме...
"PRB: My application can't write to its directory when run as a regular user"
http://www.jrsoftware.org/iskb.php?cantwritetoapp

но у нас проблема, менять код нельзя, а открывать дыру не хочется... в тоже время когда использовали Install Shield таких проблем не возникало... или мы просто про них ничего не знали? :)

Владимир

Johny777 02-03-2014 01:15 2317908

Farser21, я ни фига не понял что ты хочешь. Изучи ка для начала методы класса TNewCheckListBox коим и является ComponentsList и может твой вопрос отпадёт

Farser21 02-03-2014 01:27 2317910

Johny777, объясняю. Я скачал готовый установщик переделал под себя, осталось одно это добавить окно в котором можно будет выбирать компоненты. Но есть одно "Но" у меня уникальный дизайн поэтому добавить окно компонентов через Дизайнер диалогов я не могу. И собственно сам вопрос, "Как добавить окно компонентов со своим размером и координатами в скрипте?"

Johny777 02-03-2014 01:33 2317911

Farser21, дык оно автоматом добавляется, стоит вписать в секции скрипта [Components] какой-нибудь "компонент"!
а размер и координаты настраиваешь через метод класса SetBounds(...);

или тебе ещё один TNewCheckListBox нужен помимо стандартного?

Farser21 02-03-2014 01:36 2317914

Johny777, не так все просто как ты думаешь.
"Я скачал готовый установщик переделал под себя"
"Но есть одно "Но" у меня уникальный дизайн поэтому добавить окно компонентов через Дизайнер диалогов я не могу"
А значит если оно не выводиться через Дизайнер диалог, то и секция [Components] тоже не добавляет окно компонентов.

Johny777 02-03-2014 01:49 2317918

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

Цитата:

Цитата Farser21
и секция [Components] тоже не добавляет окно компонентов »

по ходу автор твоего скрипта не пойми зачем скрыл OuterNotebook. Мои поздравления!

Farser21 02-03-2014 01:54 2317921

Johny777, http://rghost.ru/52758435

"значит создавай на странице в ручную через код. И вообще базар о ни о чём"

В том и дело, что я не могу создать в ручную поэтому и прошу помощи.

Johny777 02-03-2014 02:57 2317933

Farser21 согласно картинкам сверху отображающим статус текущей страницы страница компонентов у тебя есть.
но согласно коду её роль выполняет страница задач wpSelectTasks
как я уже говорил. Добавив секцию [Components] ты получишь страницу с компонентами, но пустую потому что я правильно предположил, что OuterNotebook скрыт
предлагаю поступить так
1. заводим себе секцию с компонентами. Для начала вот такую маленькую
[Components]
Name: "main"; Description: "Main Files";
2. пропускаем возникшую страницу ведь у нас есть страница задач - wpSelectTasks, исполняющая роль заместителя страницы компонетов предположительно по непостижимой задумке автора :)
"вкопируй" себе эту функцию где-нибудь
читать дальше »
Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
    Result := (PageID = wpSelectComponents);
end;


3. в процедуре InitializeWizard после авторских манипуляций с визуальными компонентами мы установим родителем ComponentsList-а нашу главную форму и скроем его, чтоб он не маячил на каждой "странице"
читать дальше »
Код:

procedure InitializeWizard;
begin
    CreateWizardImage;
    CreateWizard;
    ButtonsTextures;
 
    WizardForm.ComponentsList.Parent := WizardForm;
    WizardForm.ComponentsList.SetBounds(30, 230, 300, 100); // устанавливаем координаты (слева, сверху, ширина, высота)
    WizardForm.ComponentsList.Color := WizardForm.Color;  // цвет присвоим от  цвета WizardForm
    WizardForm.ComponentsList.Hide;
// ну и спрячем

....


4. в процедуре procedure CurPageChanged(CurPageID: Integer);
нужно вписать
читать дальше »
Код:

wpSelectDir:
begin
    ...

    WizardForm.ComponentsList.Hide;
end;

wpSelectProgramGroup:
begin
    ...
   
    WizardForm.ComponentsList.Hide;
end;

wpSelectTasks:
begin
    ...

    WizardForm.ComponentsList.Show;
end;

wpReady:
begin
    ...

    WizardForm.ComponentsList.Hide;
end;


другими словами мы показываем его на странице wpSelectTasks, а на предыдущей и последующей скрываем
здесь правда я скрываю его на 2-х предыдущих: wpSelectProgramGroup, wpSelectDir
хотя достаточно на wpSelectProgramGroup, но почему-то эта страница перепрыгивается.

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

[Components]
Name: "program"; Description: "Program Files"; Check: Extract('program');
Name: "help"; Description: "Help File"; Check: Extract('help');
Name: "readme"; Description: "Readme File"; Check: Extract('readme');


[code  ]

function Extract( const ComponentName: String ): Boolean;
begin
    case
ComponentName of
   
       
'program':
        begin
           
// здесь код отвечающий за распаковку файлов этого компонента
       
end;
       
        'help':
        begin
           
// соответсвенно
       
end;
       
        'readme':
        begin
           
// ...
       
end;
       
    end;
end;


результат:

Farser21 02-03-2014 12:22 2317996

Johny777, спасибо просто огромнейшое)

Возникала небольшая проблемка, все сделал как ты написал, но почему-то пропускает вообще страницу компонентов.
Может это из-за того, что я не могу поставить .... выдает ошибку.

Nordek 02-03-2014 12:55 2318007

Цитата:

Цитата Farser21
спасибо просто огромнейшое) »

Помощь » Использование форума » Как я могу отметить сообщение полезным?

Johny777 02-03-2014 14:49 2318061

Farser21, только что сделал ещё раз всё то что у меня в посте и всё нормально.
"..." это условно твой код который уже есть.
те например в оригинале у тебя в wpReady вот так
читать дальше »
Код:

wpReady:
begin
//WerInctall1.Caption:='Всё готово к установке';
//WerInstall2.Caption:='Программа установки готова начать установку «{#MyAppName}» на Ваш компьютер.';
ImgSetVisibility(work4,True);
ImgSetVisibility(Ready,True);
 ReadyLabel1.Show;
 ReadyLabel2.Show;                                               
// ReadyLabel3.Show;                               
end;


роль многточия выполняет
читать дальше »
Код:

//WerInctall1.Caption:='Всё готово к установке';
//WerInstall2.Caption:='Программа установки готова начать установку «{#MyAppName}» на Ваш компьютер.';
ImgSetVisibility(work4,True);
ImgSetVisibility(Ready,True);
 ReadyLabel1.Show;
 ReadyLabel2.Show;                                               
// ReadyLabel3.Show; 



ну и в конце этого участка команд ты пишешь в данном случае WizardForm.ComponentsList.Hide;
получаешь
читать дальше »
Код:

wpReady:
begin
//WerInctall1.Caption:='Всё готово к установке';
//WerInstall2.Caption:='Программа установки готова начать установку «{#MyAppName}» на Ваш компьютер.';
ImgSetVisibility(work4,True);
ImgSetVisibility(Ready,True);
 ReadyLabel1.Show;
 ReadyLabel2.Show;                                               
// ReadyLabel3.Show;

WizardForm.ComponentsList.Hide;
end;



вот на всякий случай рабочий скрипт http://rghost.ru/private/52766344/4e...e14754b9935f9c

Farser21 02-03-2014 15:02 2318066

Johny777, вроде бы разобрался спасибо!

Farser21 02-03-2014 16:33 2318110

Johny777, Какой код должен отвечать за установку компонента в этом скрипте
http://rghost.ru/private/52766344/4e...e14754b9935f9c

ghost7339@vk 02-03-2014 16:50 2318116

Всем привет подскажите пожалуйста можно ли в inno реализовать что бы в каждом окошке типа (ПРИВЕТСТВИЕ, ПРОВЕРКА СИС.ТРЕБ, ВЫБОР ПАПКИ УСТАНОВКИ и Т.Д) воспроизводилось отдельное видео?

Ivan_009 02-03-2014 17:11 2318131

Какой шрифт кроме MS Serif. Идентично отображается на всех системах...
Заранее спасибо...

Johny777 02-03-2014 17:24 2318134

Farser21, судя по тому что у тебя там импортируется API IsDone то вызываешь его функции распаковки.
По IsDone я тебе не помощник, тк его API и примеры использования не изучал и честно говоря не хочу.
тут кстати хватает экспертов по IsDone..., например Ваня постом выше его использует

Ivan_009, все системные шрифты. Tahoma например

Ivan_009 02-03-2014 17:39 2318142

Цитата:

Цитата Johny777
все системные шрифты. Tahoma например »

Johny777, Я имел ввиду отображение...

Tahoma на XP не так отображается... (Тоесть без сглаживания) А нужны те шрифты у которых сглаживание отсутствует... :)

Johny777 02-03-2014 17:48 2318145

Цитата:

Цитата Ivan_009
Я имел ввиду отображение... »

тогда хз
гугл в помощь

Ivan_009 02-03-2014 17:53 2318149

Цитата:

Цитата Farser21
Какой код должен отвечать за установку компонента в этом скрипте »

Какой именно компонент не пойму никак... :laugh:

Цитата:

Цитата Johny777
гугл в помощь »

Нашел : Fixedsys :wink:

Farser21 02-03-2014 20:22 2318228

Ivan_009, ну вот смотри. Я хочу установить компонент допустим File1 и у меня к нему лежит файл File1, но у меня в установщике какая-то распаковка через IsDone. Возможно как-то убрать это распаковка и в целом сам IsDone? Чтобы просто при выборе компонента устанавливался нужный файл и не было никакой распаковки.

innot20 02-03-2014 21:02 2318249

Есть не большой вопросик,
данный код распаковывает архив pkg
Код:

procedure ExtractResources();
var
  ResultCode: Integer;
begin
  WizardForm.StatusLabel.Caption:='Распаковка архива gui.pkg. Может занять очень длительное время...';
  CreateDir(ExpandConstant('{app}\res_mods'));
  Exec(ExpandConstant('{app}\unZIP.exe'), '-o res\packages\gui.pkg -d res_mods', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles);
end;

может ли inno setup ограничивать скорость распаковки, потому что когда я распаковываю через консоль на это тратиться буквально 1 минута
а когда через inno setup от 5 минут до 20

Nordek 03-03-2014 08:31 2318390

Цитата:

Цитата Ivan_009
Какой шрифт кроме MS Serif. »

Например MS Sans Serif':
Код:

[Code]
procedure InitializeWizard();
begin
  with
WizardForm do
  begin
   
Font.Name := 'MS Sans Serif';
  end;
end;


Ivan_009 03-03-2014 12:02 2318463

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

Вокруг маски... http://rghost.ru/52786114

audiofeel 04-03-2014 04:05 2318823

Цитата:

Цитата Ivan_009
Подскажите пожалуйста как сделать тень для инсталлятора... »

пример, но нужен BMP
http://krinkels.org/attachment.php?a...8&d=1393663222

Ivan_009 04-03-2014 10:17 2318887

audiofeel, Это пример из ботвы там тени нет... :(

R.i.m.s.k.y. 04-03-2014 13:55 2318973

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

Вопрос: как вывернуться?

audiofeel 04-03-2014 16:24 2319023

Ivan_009,
Цитата:

Цитата Ivan_009
audiofeel, Это пример из ботвы там тени нет... »

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


Serega 04-03-2014 22:51 2319187

Цитата:

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

Узнаёте SID пользователя и пишите вместо HKEY_CURRENT_USER в HKEY_USERS\S-1-5-21-1085031214-1844823847-839522115-1106 - это и будет реестр вашего пользователя.

Dodakaedr 05-03-2014 15:17 2319495

Скажите, пожалуйста, в inno имеется константа для ProgramData?

TryRooM 05-03-2014 16:30 2319535

Dodakaedr,
ProgramData
[Files]
Source: {commonappdata}

Dodakaedr 05-03-2014 17:05 2319560

спс. но мне надо programdata а не Application Data.

Как скрыть пункт "О программе" в инсталяторе? использую CallbackCtrl.dll при отмене установки исталятор выснет.

TryRooM 05-03-2014 17:50 2319584

Dodakaedr,
с\ProgramData
[Files]
Source: {commonappdata}

DestDir: {commonappdata}\Blumentals в скрипте

C:\ProgramData\Blumentals что имеем на выходе

Dodakaedr 05-03-2014 17:51 2319586

TryRooM, попробую

nik1967 05-03-2014 19:08 2319617

Цитата:

Цитата Dodakaedr
Как скрыть пункт "О программе" в инсталяторе? »

Код:

WizardForm.Position:= poScreenCenter;

El Sanchez 05-03-2014 19:27 2319623

Цитата:

Цитата Serega
Узнаёте SID пользователя »

R.i.m.s.k.y., SID или имя залогиненного пользователя можете узнать так:
читать дальше »

Код:

#define A = (Defined UNICODE) ? "W" : "A"
const
   
WTS_CURRENT_SERVER_HANDLE = 0;
    WTS_CURRENT_SESSION = (-1);
    WTSUserName = 5;

function WTSQuerySessionInformation(hServer: THandle; SessionId, WTSInfoClass: DWORD; var ppBuffer: Longint; var pBytesReturned: DWORD): BOOL; external 'WTSQuerySessionInformation{#A}@wtsapi32.dll stdcall';
procedure WTSFreeMemory(pMemory: Longint); external 'WTSFreeMemory@wtsapi32.dll stdcall';

///////////////////////////////////////////////////////
function GetLoggedOnUser(const IsSID: Boolean): String;
var
   
i: Integer;
    aNames: TArrayOfString;
    dwLength: DWORD;
    lpBuffer: Longint;
begin
    if not
RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList', aNames) then Exit;
    try
        if not
WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, lpBuffer, dwLength) then Exit;
        Result := CastIntegerToString(lpBuffer);
        if IsSID then for i := 0 to GetArrayLength(aNames)-1 do if Pos(Lowercase(Result), LowerCase(ExpandConstant(Format('{reg:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%s,ProfileImagePath|}', [aNames[i]])))) > 0 then
        begin
           
Result := aNames[i];
            Break;
        end;
    finally
       
WTSFreeMemory(lpBuffer);
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
   
MsgBox(GetLoggedOnUser(False), mbInformation, MB_OK);
    MsgBox(GetLoggedOnUser(True), mbInformation, MB_OK);
end;


Dodakaedr 05-03-2014 22:10 2319674

nik1967, спасибо

Dodakaedr 05-03-2014 22:40 2319689

Как это исправить?


legik2003 06-03-2014 02:41 2319762

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


Debugger 06-03-2014 13:09 2319875

У меня в проекте довольно много компонентов. Но некоторые записи в реестр в секции [Registry] общие для всех компонентов. Нельзя ли както сделать одну общую запись для нескольких компонентов? К сожалению указание в флаге Components нескольких приводит к ошибке при компиляции. Иначе ужасно много одинаковой писанины для каждого компонента получается!

Johny777 06-03-2014 14:00 2319888

nik1967, Dodakaedr, непосредственное удаление элемента "О программе" из системного меню программы
читать дальше »
Код:

const
   
MF_BYPOSITION = $400;

function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: HMENU; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';

function DeleteAboutMenu(): BOOL;
var
   
hSysMenu: HMENU;
begin
   
// получаем хэндл сис. меню
   
hSysMenu := GetSystemMenu(WizardForm.Handle, False);

              // удаляем по позиции(индексу) MF_BYPOSITION. На 7-м месте находится разделитель. Удаляем его
   
Result := DeleteMenu(hSysMenu, 7, MF_BYPOSITION) and
   
             
// после этого на 7-ю позицию встаёт айтем "О программе". Ещё раз удаляем 7-й айтем
             
DeleteMenu(hSysMenu, 7, MF_BYPOSITION);
end;

procedure InitializeWizard();
begin
   
DeleteAboutMenu();
end;


PS: можно конечно сначала удалить 8-й (это и есть изначально айтем "О программе"), а потом 7-й.
Хотя вообще 7-й не обязательно удадять. Но нафиг нужен разделитель который ничего не отделяет?

Serega, El Sanchez, благодарю за полезную информацию.

Nordek 06-03-2014 14:04 2319890

Цитата:

Цитата Dodakaedr
Как это исправить? »

Никак. Реализовать внесение значений в "SYSTEM\ControlSet001\Enum\Root" возможно, но не нужно - от незнания как это работает и для чего: лучше не лезть вообще. По данному вопросу вряд ли кто поможет.

Shkutu 06-03-2014 16:26 2319937

Цитата:

Цитата Debugger
указание в флаге Components нескольких приводит к ошибке при компиляции »

Это смотря как указывать.
В этом случае компоненты нужно соединять логическими операциями, в вашем случае скорее "or".
Код:

[Components]
Name: "a"; Description: "comp a"
Name: "b"; Description: "comp b"

[Registry]
Root: "HKLM"; Subkey: ... ; Components a or b


Dodakaedr 06-03-2014 17:25 2319954

Цитата:

Цитата Nordek
Никак. Реализовать внесение значений »

Ясно. Спасибо. А unpacker есть который поддерживает 5.5 версию inno setup?

Dodakaedr 06-03-2014 17:52 2319971

Цитата:

Цитата saurn
Вроде пока только до версии 5.5.4 »

Это та что в шапке?

saurn 06-03-2014 17:52 2319972

Цитата:

Цитата Dodakaedr
Ясно. Спасибо. А unpacker есть который поддерживает 5.5 версию inno setup? »

http://innounp.sourceforge.net/

Debugger 06-03-2014 20:30 2320033

Цитата:

Цитата Shkutu
В этом случае компоненты нужно соединять логическими операциями, в вашем случае скорее "or". »

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

Dodakaedr 06-03-2014 21:05 2320040

Использую Inno setup 5.5.4 скрипт с версии 5.5.0
Почему ругается "Required function or procedure "IsWin32" not found"?

Выскакивает на этой строке
Код:

Source: "{sys}\drivers\mbam,1.sys"; DestDir: "{sys}\drivers"; DestName: "mbam.sys"; Check: "IsWin32"; MinVersion: 0,5.01sp2; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion

Ivan_009 06-03-2014 21:11 2320042

Как прописать в батнике упаковку в архив 7z... Такого метода: http://rghost.ru/52867458
Заранее спасибо...

vint56 06-03-2014 23:45 2320139

Ivan_009
"7z.exe" a -t7z -m0=LZMA2 -mmt=2 -mx9 -md=64m -mfb=64 -ms=4g -sccUTF-8 "-wC:\" "C:\totalcmd.7z" "C:\totalcmd"

saurn 06-03-2014 23:54 2320146

Цитата:

Цитата Dodakaedr
Почему ругается "Required function or procedure "IsWin32" not found"? »

В инно нет встроенной функции IsWin32. Значит функция самописная, она была объявлена в секции [code], которая отсутствует.

P.S.
Скрипт, выдранный анпакером, перед компиляцией требует редактирования.

Dodakaedr 06-03-2014 23:57 2320150

saurn, Я брал чисто оригинальный скрипт и там тоже ругается. Секции code там вообще нету...

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

;InnoSetupVersion=5.5.0

[Setup]
AppName=Malwarebytes Anti-Malware
AppVersion=2.00.0.0504
AppPublisher=Malwarebytes Corporation
AppPublisherURL=http://www.malwarebytes.org
DefaultDirName={pf}\Malwarebytes Anti-Malware
DefaultGroupName=Malwarebytes Anti-Malware
UninstallDisplayIcon={app}\mbam.exe
OutputBaseFilename=mbam-setup-2.00.0.0504
Compression=lzma2
ChangesAssociations=yes
AllowNoIcons=yes

[Files]
Source: "{sys}\drivers\mbam,1.sys"; DestDir: "{sys}\drivers"; DestName: "mbam.sys"; Check: "IsWin32"; MinVersion: 0.0,5.01 Service Pack 2; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{sys}\drivers\mbam,2.sys"; DestDir: "{sys}\drivers"; DestName: "mbam.sys"; Check: "IsWin64"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion 64bit
Source: "{sys}\drivers\mwac,1.sys"; DestDir: "{sys}\drivers"; DestName: "mwac.sys"; Check: "IsWin32"; MinVersion: 0.0,6.0; OnlyBelowVersion: 0.0,6.01; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{sys}\drivers\mwac,2.sys"; DestDir: "{sys}\drivers"; DestName: "mwac.sys"; Check: "IsWin64"; MinVersion: 0.0,6.0; OnlyBelowVersion: 0.0,6.01; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion 64bit
Source: "{sys}\drivers\mwac,3.sys"; DestDir: "{sys}\drivers"; DestName: "mwac.sys"; Check: "IsWin32"; MinVersion: 0.0,6.01; OnlyBelowVersion: 0.0,6.02; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{sys}\drivers\mwac,4.sys"; DestDir: "{sys}\drivers"; DestName: "mwac.sys"; Check: "IsWin64"; MinVersion: 0.0,6.01; OnlyBelowVersion: 0.0,6.02; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion 64bit
Source: "{sys}\drivers\mwac,5.sys"; DestDir: "{sys}\drivers"; DestName: "mwac.sys"; Check: "IsWin32"; MinVersion: 0.0,6.02; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{sys}\drivers\mwac,6.sys"; DestDir: "{sys}\drivers"; DestName: "mwac.sys"; Check: "IsWin64"; MinVersion: 0.0,6.02; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion 64bit
Source: "{sys}\drivers\mbamchameleon,1.sys"; DestDir: "{sys}\drivers"; DestName: "mbamchameleon.sys"; Check: "IsWin32"; MinVersion: 0.0,5.01 Service Pack 2; OnlyBelowVersion: 0.0,6.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{sys}\drivers\mbamchameleon,2.sys"; DestDir: "{sys}\drivers"; DestName: "mbamchameleon.sys"; Check: "IsWin32"; MinVersion: 0.0,6.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{sys}\drivers\mbamchameleon,3.sys"; DestDir: "{sys}\drivers"; DestName: "mbamchameleon.sys"; Check: "IsWin64"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion 64bit
Source: "{app}\atl100,1.dll"; DestDir: "{app}"; DestName: "atl100.dll"; Check: "IsWin32"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete
Source: "{app}\atl100,2.dll"; DestDir: "{app}"; DestName: "atl100.dll"; Check: "IsWin64"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete
Source: "{app}\mbamext,1.dll"; DestDir: "{app}"; DestName: "mbamext.dll"; Check: "IsWin32"; AfterInstall: "RegisterContextMenu"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete
Source: "{app}\mbamext,2.dll"; DestDir: "{app}"; DestName: "mbamext.dll"; Check: "IsWin64"; AfterInstall: "RegisterContextMenu"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete
Source: "{app}\mbam.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\mbamcore.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\mbamsrv.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\mbamtoast.dll"; DestDir: "{app}"; MinVersion: 0.0,6.02; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\mbam.exe"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\mbamservice.exe"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\mbamscheduler.exe"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\mbampt.exe"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\mbam.chm"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist
Source: "{app}\license.rtf"; DestDir: "{app}"; MinVersion: 0.0,5.0;
Source: "{app}\changes.txt"; DestDir: "{app}"; MinVersion: 0.0,5.0;
Source: "{app}\Languages\lang_en.qm"; DestDir: "{app}\Languages"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\rules.ref"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\actions.ref"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\swissarmy.ref"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\domains.ref"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware"; MinVersion: 0.0,6.0 Service Pack 1;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\ips.ref"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware"; MinVersion: 0.0,6.0 Service Pack 1;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\exclusions.dat"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware"; MinVersion: 0.0,5.0; Flags: uninsneveruninstall onlyifdoesntexist
Source: "{app}\master.conf"; DestDir: "{app}"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\net.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\build.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\database.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\manifest.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\marketing.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0;
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\scheduler.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0; Flags: uninsneveruninstall onlyifdoesntexist
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\statistics.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0; Flags: uninsneveruninstall onlyifdoesntexist
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\gatekeeper.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0; Flags: uninsneveruninstall onlyifdoesntexist
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\notifications.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0; Flags: uninsneveruninstall onlyifdoesntexist
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\license.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; Check: "ShouldReplaceLicenseConf"; MinVersion: 0.0,5.0; Flags: uninsneveruninstall
Source: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration\settings.conf"; DestDir: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Configuration"; MinVersion: 0.0,5.0; Flags: uninsneveruninstall onlyifdoesntexist
Source: "{app}\Plugins\fixdamage.exe"; DestDir: "{app}\Plugins"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\imageformats\qgif4.dll"; DestDir: "{app}\imageformats"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\7z.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\msvcp100.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\msvcr100.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\QtCore4.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\QtGui4.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\QtNetwork4.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: restartreplace uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\chameleon.chm"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete
Source: "{app}\Chameleon\Windows\mbam-killer.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\mbam-chameleon.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\mbam-chameleon.com"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\mbam-chameleon.pif"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\mbam-chameleon.scr"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\svchost.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\firefox.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\firefox.com"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\firefox.pif"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\firefox.scr"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\iexplore.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\winlogon.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\rundll32.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion
Source: "{app}\Chameleon\Windows\windows.exe"; DestDir: "{app}\Chameleon\Windows"; MinVersion: 0.0,5.0; Flags: skipifsourcedoesntexist uninsrestartdelete ignoreversion

[Dirs]
Name: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Logs"; Flags: uninsneveruninstall
Name: "{commonappdata}\Malwarebytes\Malwarebytes Anti-Malware\Quarantine"; Flags: uninsneveruninstall

[Registry]
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\mbam.exe"; ValueType: String; ValueData: "{app}\mbam.exe"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\mbam.exe"; ValueName: "Path"; ValueType: String; ValueData: "{app}"; MinVersion: 0.0,5.0; Flags: uninsdeletekey

[Run]
Filename: "{app}\mbam.exe"; Parameters: "/starttrial"; Description: "{cm:StartTrial,Malwarebytes Anti-Malware}"; Check: "ShowStartTrial"; MinVersion: 0.0,5.0; Flags: postinstall skipifsilent
Filename: "{app}\mbam.exe"; Description: "{cm:LaunchProgram,Malwarebytes Anti-Malware}"; MinVersion: 0.0,5.0; Flags: postinstall skipifsilent nowait

[Icons]
Name: "{group}\Malwarebytes Anti-Malware"; Filename: "{app}\mbam.exe"; MinVersion: 0.0,5.0;
Name: "{group}\Malwarebytes Anti-Malware Notifications"; Filename: "{app}\mbam.exe"; WorkingDir: "{app}"; MinVersion: 0.0,6.02;
Name: "{group}\Malwarebytes Anti-Malware Help"; Filename: "{app}\mbam.chm"; MinVersion: 0.0,5.0;
Name: "{group}\Tools\Malwarebytes Anti-Malware Chameleon"; Filename: "{app}\Chameleon\Windows\chameleon.chm"; MinVersion: 0.0,5.0;
Name: "{group}\{cm:UninstallProgram,Malwarebytes Anti-Malware}"; Filename: "{uninstallexe}"; MinVersion: 0.0,5.0;
Name: "{commondesktop}\Malwarebytes Anti-Malware"; Filename: "{app}\mbam.exe"; Tasks: desktopicon; MinVersion: 0.0,5.0;

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; MinVersion: 0.0,5.0;

[CustomMessages]
NameAndVersion=%1 version %2
AdditionalIcons=Additional icons:
CreateDesktopIcon=Create a &desktop icon
CreateQuickLaunchIcon=Create a &Quick Launch icon
ProgramOnTheWeb=%1 on the Web
UninstallProgram=Uninstall %1
LaunchProgram=Launch %1
AssocFileExtension=&Associate %1 with the %2 file extension
AssocingFileExtension=Associating %1 with the %2 file extension...
UpdateProgram=Update %1
UpdatingProgram=Updating %1
AcceptLicense=I accept the terms of this License Agreement.
AcceptNonComm=I accept that this software is for non-commercial use only.
MoreInfo=(More Info)
StartTrial=Enable free trial of %1 Premium
OutdatedWindows=Your version of Windows is outdated and presents a serious threat to the security of your system.%n%nMalwarebytes Anti-Malware requires at least Windows XP Service Pack 2 to be fully-functional. It is highly recommended that you upgrade Windows. Do you want to continue with installation anyway?
Uninstall1x=Malwarebytes' Anti-Malware 1.x is currently installed and could not be uninstalled properly.  Please uninstall Malwarebytes' Anti-Malware 1.x manually, reboot, and then try the installation again.
Enter20KeyPlease=Please enter the new Malwarebytes Anti-Malware Premium license key sent to you via email. In the past week or so, you should have received an email with the subject line "Your new Malwarebytes Anti-Malware Premium license key-do not delete" from Malwarebytes. If you do not see this email in your inbox, please check your spam or junk folder.=Please enter the new Malwarebytes Anti-Malware Premium license key sent to you via email. In the past week or so, you should have received an email with the subject line "Your new Malwarebytes Anti-Malware Premium license key-do not delete" from Malwarebytes. If you do not see this email in your inbox, please check your spam or junk folder.
PUPPrompt=PUP, or Potentially Unwanted Programs are software which are not malware but might be undesirable such as adware/advertising software and toolbars.  Malwarebytes Anti-Malware is able to detect and remove these types of software, but since they are not malware some users might not want them to be removed.
PUPChooseHow=Choose how Anti-Malware handles PUP items:
PUPComboOptionA=Remove PUP items when they are detected
PUPComboOptionB=Ask me what to do when PUP items are detected
PUPComboOptionC=Ignore all PUP items so that they are not detected
PUPHyperlinkText=Click here to learn more about how Malwarebytes classifies software as PUP


saurn 07-03-2014 00:14 2320158

Цитата:

Цитата Dodakaedr
Я брал чисто оригинальный скрипт и там тоже ругается. »

Это скрипт полученный после распаковки анпакером.

Dodakaedr 07-03-2014 00:16 2320160

Цитата:

Цитата saurn
Это скрипт полученный после распаковки анпакером. »

И в чем проблема?

Ivan_009 07-03-2014 00:31 2320167

vint56, Спасибо большое :up а как еще пароль туда прикрутить...

vint56 07-03-2014 00:46 2320178

Ivan_009
"7z.exe" a -t7z -m0=LZMA2 -mmt=2 -mx9 -md=64m -mfb=64 -ms=4g -sccUTF-8 "-pIvan_009" "-wC:\" "C:\totalcmd.7z" "C:\totalcmd"

saurn 07-03-2014 00:49 2320180

Цитата:

Цитата Dodakaedr
И в чем проблема? »

Я же уже писал: функция IsWin32 была задекларирована в секции кода, данная секция после распаковки представляется в псевдо дизассемблированном виде, а точнее в виде файла CompiledCode.bin и не годится для использования. Как, впрочем, и сам распакованый скрипт, без предварительного редактирования.

Dodakaedr 07-03-2014 01:17 2320187

saurn, Ясно

Ivan_009 07-03-2014 14:52 2320406

vint56, Что нужно добавить,чтобы невозможно было посмотреть содержимое архива.

Тоесть зашифровать имена файлов...

Код:

"7z.exe" a -t7z -m0=LZMA2 -mmt=2 -mx9 -md=64m -mfb=64 -ms=4g -sccUTF-8 "-pПароль -mhe" "-wC:\" "data\data.7z" ".\packeddata\*"
-pПароль -mhe : Не катит... :(

Да и кстати где все это можно посмотреть методы сжатия и прочее...

vint56 07-03-2014 15:29 2320438

Ivan_009 Да и кстати где все это можно посмотреть методы сжатия и прочее... в справке она есть на русском языке а насчёт скрытности это вроде не возможно
"7z.exe" a -t7z -m0=LZMA2 -mmt=on -mx9 -md=64m -mfb=64 -ms=4g -sccUTF-8 "-p1" -mhe=on "-wC:\" "C:\totalcmd-1.7z" "C:\totalcmd"
7-Zip Parameter Generator - генератор параметров командной строки для особых настроек сжатия

Ivan_009 07-03-2014 16:36 2320472

vint56, Можно пример как потом через батник этот архив распаковать... :clapping:

vint56 07-03-2014 17:14 2320487

Ivan_009
читать дальше »
e (Extract) команда
Извлекает файлы из архива в текущий каталог или в каталог вывода. Каталог вывода может быть определен ключом -o (Set Output Directory).

Эта команда копирует все извлеченные файлы в один каталог. Если Вы хотите извлечь файлы с полными путями, Вы должны использовать команду x (Extract with full paths).

7-Zip выдаст запрос пользователю перед перезаписью существующих файлов, если пользователь не установит ключ -y (Assume Yes on all queries). Если пользователь ответит, нет, то 7-Zip выдаст запрос, должен ли файл быть извлечен под новым именем. Далее ответ нет - пропускает файл, а да запросит новое имя файла.

7-Zip принимает следующие ответы:

Ответ Сокращенный Действие
Yes y
No n
Always a Принять ДА для ВСЕХ последующих запросов того же самого класса
Skip s Принять НЕТ для ВСЕХ последующих запросов того же самого класса
Quit q Выйти из программы

Сокращенные ответы допустимы.

Примеры
7z e archive.zip

извлекает все файлы из архива archive.zip в текущий каталог.

7z e archive.zip -oc:\soft *.cpp -r

извлекает все *.cpp файлы из архива archive.zip в папку c:\soft.

Примечание
7-Zip не использует системный синтаксический анализатор подстановочных знаков, и 7-Zip не следует тому архаичному правилу, по которому *.* означает любой файл. 7-Zip обрабатывает *.* как соответствие имени любого файла, который имеет расширение. Чтобы обрабатывать все файлы, Вы должны использовать подстановочные знаки *.

Ivan_009 07-03-2014 17:20 2320491

vint56, Я уже этим методом пытался : "7z.exe" e "-pПароль" "pack\pack.7z" "packeddata"

Не робит чет... :(

vint56 07-03-2014 17:37 2320501

Ivan_009
7z e archive.7z -oGameData -p1

Ivan_009 07-03-2014 17:51 2320510

vint56, Спасибо но почему то не правильно извлекает... :(

В архиве:

1 было 2 стало...

vint56 07-03-2014 18:04 2320514

Ivan_009 а за чем тебе делать распаковку через батник чем тебе не устраивает isdone
вот мой пример распаковки пароль1 для просмотра архива
http://rghost.ru/52887309

Ivan_009 07-03-2014 18:10 2320517

Цитата:

Цитата vint56
а за чем тебе делать распаковку через батник чем тебе не устраивает isdone »

Ну это я так для запаковки и распаковки при создании архива...

Farser21 08-03-2014 22:42 2320920

Всем привет, возникла такая проблема. Добавил в установщик кнопку, которая при нажатии перенаправляет на мой канал на YouTube. Как сделать, чтобы кнопка отображалась, только на первой странице (начальной, там где приветствие).

TryRooM 08-03-2014 23:56 2320958

Farser21,
OnClick:=@NewButtonOnClick
Parent:= WizardForm.WelcomePage;
Caption := 'Мой сайт';

Farser21 08-03-2014 23:56 2320959

TryRooM, разобрался) Спасибо большое)

Dodakaedr 09-03-2014 01:05 2320997

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

Farser21 09-03-2014 01:13 2320999

Когда я компилирую установщик, то у меня создаются файлы setup.exe и setup-1.bin. Как сделать чтобы все содержимое было в setup.exe и не было файлы setup-1.bin?

TryRooM 09-03-2014 02:05 2321023

Farser21,
закоментируй строки
DiskSpanning=yes
DiskSliceSize=

Farser21 09-03-2014 15:12 2321176

Возник еще 1 вопрос. У меня стоит главная картинка в начале установщика, но еще она появляется в конце после завершения установки. Можно как-то сделать, чтобы при завершении установки была не начальная картинка а другая?

P.S. Вопрос решен, просто добавил картинку через "Редактор форм".

TryRooM 09-03-2014 15:57 2321181

Farser21, пример
http://rghost.ru/52932987

saurn 09-03-2014 16:31 2321188

Цитата:

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

Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=...


[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {tmp}; Flags: deleteafterinstall;


[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
   
i: Integer;
begin
    case
CurStep of
       
ssInstall:
        begin
           
ExtractTemporaryFile('MyProg.exe');
            Exec(ExpandConstant('{tmp}\MyProg.exe'), '', '', 5, ewWaitUntilTerminated, i);
        end;
    end;
end;


Dodakaedr 09-03-2014 17:28 2321202

saurn, а как теперь сделать чтобы импортированный exe-шник работал в тихом режиме?

saurn 09-03-2014 17:37 2321206

Dodakaedr, зависит от поддерживаемых параметров ком строки запускаемой программы. Например для инсталяторов созданых в инно это /SILENT и /VERYSILENT.
Код:

Exec(имя программы, 'параметр ком строки', '', 5, ewWaitUntilTerminated, i);

Dodakaedr 09-03-2014 17:43 2321210

saurn, спс

Dodakaedr 09-03-2014 18:57 2321244

Как запретить доступ программе к интернету через брандмауэр windows в inno setup?

Farser21 09-03-2014 19:59 2321261

У меня в установщике когда удаляешь компоненты через unins000.exe, то удаляется папка res_mods. Как сделать так, чтобы удалялось, только содержимое папки т.е. res_mods\*.

Заранее спасибо за ответ.

Вот скрипт http://rghost.ru/private/52939112/87...40d68ea2273562

Dodakaedr 09-03-2014 22:46 2321317

И как прописать строку в hosts средством inno?

TryRooM 09-03-2014 23:47 2321342

Dodakaedr,
http://rghost.ru/52945164

Dodakaedr 10-03-2014 00:04 2321348

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

TryRooM 10-03-2014 00:10 2321349

Dodakaedr,
http://rghost.ru/52945686
function повторов
пригодятся

Dodakaedr 10-03-2014 00:12 2321350

TryRooM, не знаете как запретить доступ программе к интернету через брандмауэр windows в inno setup?

TryRooM 10-03-2014 00:46 2321361

Dodakaedr,
http://rghost.ru/52946395
Как добавить программу в исключения брандмауэра
3 примера

Dodakaedr 10-03-2014 11:33 2321466

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

Farser21 10-03-2014 11:43 2321468

Цитата:

Цитата Farser21
У меня в установщике когда удаляешь компоненты через unins000.exe, то удаляется папка res_mods. Как сделать так, чтобы удалялось, только содержимое папки т.е. res_mods\*.
Заранее спасибо за ответ.
Вот скрипт http://rghost.ru/private/52939112/87...40d68ea2273562 »


El Sanchez 10-03-2014 11:51 2321470

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


Время: 17:17.

Время: 17:17.
© OSzone.net 2001-