1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

FAQ FAQ по Inno Setup

Тема в разделе "Inno Setup", создана пользователем Shegorat, 16 июн 2011.

Метки:
  1. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    Эта тема предназначена как сборник скриптов и примеров.
    Правила в этой теме следующие:
    1. Один пост - один пример.
    2. Все посты оформляются в виде вопрос - ответ.
    3. Для большего удобства новые посты оформляются также как уже существующие. Ниже пример формления
    4. Если к вашему примеру прилагаются файлы, заливайте их во вложение.

    [B][COLOR=DarkRed]В:[/COLOR][/B] Как написать простейший инсталлятор?
    [B][COLOR=DarkBlue]О:[/COLOR][/B] Примерно так
    [SPOILER=Код][CODE]
    [Setup]
    AppName=My Program
    AppVersion=1.5
    DefaultDirName={pf}\My Program
    DefaultGroupName=My Program
    UninstallDisplayIcon={app}\MyProg.exe
    Compression=lzma2
    SolidCompression=yes
    OutputDir=userdocs:Inno Setup Examples Output

    [Files]
    Source: "MyProg.exe"; DestDir: "{app}"
    Source: "MyProg.chm"; DestDir: "{app}"
    Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

    [Icons]
    Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
    [/CODE][/SPOILER]
     
    agrei678, Nemko, YURSHAT и 3 другим нравится это.
  2. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как узнать где находится Setup.exe на CD или на жестком диске?
    О: Примерно так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVerName=MyApp
    4. DefaultDirName={pf}\MyApp
    5.  
    6. [code]
    7. type
    8.   SECURITY_ATTRIBUTES = record
    9.     nLength: DWord;
    10.     lpSecurityDescriptor: longint;
    11.     bInheritHandle: Boolean;
    12.   end;
    13.  
    14. const
    15.   GENERIC_READ = $80000000;
    16.   GENERIC_WRITE = $40000000;
    17.   CREATE_ALWAYS = 2;
    18.  
    19. function CreateFile(lpFileName: PChar; dwDesiredAccess, dwShareMode: DWord; LPSECURITY_ATTRIBUTES: SECURITY_ATTRIBUTES; dwCreationDisposition, dwFlagsAndAttributes: DWord; hTemplateFile: THandle): THandle; external 'CreateFileA@kernel32.dll stdcall';
    20. function CloseHandle(Handle: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';
    21.  
    22. function ISEnvHDD(): Boolean;
    23. var Hndl: Thandle; SA: SECURITY_ATTRIBUTES;
    24. begin
    25.   Result:= False;
    26.   SA.nLength:=SizeOf(SA);
    27.   SA.bInheritHandle:=True;
    28.   Hndl:= CreateFile(PChar(ExpandConstant('{src}\test.tmp')), GENERIC_READ or GENERIC_WRITE, 0, SA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    29.   if Hndl>0 then Result:= True else Result:=False;
    30.   CloseHandle(Hndl);
    31.   DeleteFile(ExpandConstant('{src}\test.tmp'));
    32. end;
    33.  
    34. function InitializeSetup(): Boolean;
    35. begin
    36. Result:= True;
    37. if ISEnvHDD then begin
    38.   MsgBox('Setup.exe Находится на HDD. Запуск невозможен', mbConfirmation, MB_OK);
    39.   Result:=False;
    40. end;
    41. end;
     
    Nemko, DICI BF, Craj и ещё 1-му нравится это.
  3. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как сделать проверку через реестр установлена программа или нет?
    О: Так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppverName=MyApp
    4. DefaultDirName={pf}\MyApp
    5.  
    6. [Registry]
    7. Root: HKLM; Subkey: SOFTWARE\MyApp; ValueName: InstallPath; ValueType: string; ValueData: {app}; Flags: uninsdeletekey
    8.  
    9. [code]
    10. function InitializeSetup(): Boolean;
    11. begin
    12.   Result:= True;
    13.   if RegValueExists(HKLM, 'SOFTWARE\MyApp', 'InstallPath') then begin
    14.     MsgBox('Копия данной программы уже установлена! Установка будет прекращена', mbConfirmation, MB_OK);
    15.     Result:= False;
    16.   end;
    17. end;
     
    Paul, Nemko, DICI BF и 2 другим нравится это.
  4. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как добавить описание к компонентам в ComponentsList?
    О: Вот пример без использования различных библиотек (Требуется расширенная версия InnoSetup от ResTools)
    Код (Text):
    1. [Setup]
    2. AppName=My Program
    3. AppVerName=My Program 1.5
    4. DefaultDirName={pf}\My Program
    5. DefaultGroupName=My Program
    6. ComponentsListTVStyle=true
    7.  
    8. [Languages]
    9. Name: russian; MessagesFile: compiler:Languages\Russian.isl
    10.  
    11. [CustomMessages]
    12. russian.ComponentsName1=Моя программа™
    13. russian.ComponentsName2=Помощь
    14. russian.ComponentsName2_1=Документация
    15. russian.ComponentsName2_2=Руководство пользователя
    16. russian.ComponentsInfoPanel1=Описание
    17. russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
    18. russian.ComponentsDescription1=Устанавливается обязательно
    19. russian.ComponentsDescription2=Помощь
    20. russian.ComponentsDescription3=Прочитать документацию
    21. russian.ComponentsDescription4=Прочитать руководство пользователя
    22.  
    23. [Components]
    24. Name: readme; Description: Справка; Types: full custom;
    25. Name: readme\en; Description: "Английская "; Types: full custom; Flags: fixed
    26. Name: readme\ru; Description: Русская; Types: full
    27.  
    28. ;*************************************************************************
    29. Name: plugs; Description: Плагины; Types: full ; Flags: collapsed
    30. Name: plugs\wlx; Description: Внутреннего просмотра; Types: full
    31. Name: plugs\wcx; Description: Архиваторные; Types: full
    32. Name: plugs\wfx; Description: Системные; Types: full
    33. Name: plugs\wfx\CanonCam; Description: CanonCam; Types: full
    34. Name: plugs\wfx\PluginManager; Description: PluginManager; Types: full
    35. Name: plugs\wfx\Registry; Description: Registry; Types: full
    36. Name: plugs\wfx\Services; Description: Services; Types: full
    37. Name: plugs\wfx\StartupGuard; Description: StartupGuard; Types: full
    38. Name: plugs\wdx; Description: Другие; Types: full
    39.  
    40. [Code]
    41. type
    42.   TComponentDesc = record Description: String; Index: Integer; end;
    43.  
    44. var
    45.   Descs: array of TComponentDesc;
    46.   Info: TNewStaticText;
    47.   InfoCaption: TNewStaticText;
    48.   InfoPanel: TPanel;
    49.   Indx: Integer;
    50.  
    51. procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
    52. var i: Integer;
    53. begin
    54.   Indx:=-1;
    55.   for i:= 0 to GetArrayLength(Descs)-1 do begin
    56.   if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
    57.   if (Indx >=0)and(Area=iaItem) then Info.Caption:= Descs[Indx].Description else Info.Caption:= ExpandConstant('{cm:ComponentsInfoPanel2}');
    58. end;
    59.  
    60. procedure AddDescription(AIndex: Integer; ADescription: String);
    61. var i, k: Integer;
    62. begin
    63. i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
    64. Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
    65. end;
    66.  
    67. procedure InitializeWizard();
    68. begin
    69.   WizardForm.TypesCombo.Visible:=False;
    70.   WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
    71.   WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
    72.   WizardForm.ComponentsList.Width := ScaleX(417);
    73.   WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription
    74.  
    75.   InfoPanel := TPanel.Create(WizardForm);
    76.   InfoPanel.Parent := WizardForm.SelectComponentsPage;
    77.   InfoPanel.Caption := '';
    78.   InfoPanel.Top := ScaleY(190);
    79.   InfoPanel.Left := ScaleX(0);
    80.   InfoPanel.Width := ScaleX(417);
    81.   InfoPanel.Height := ScaleY(40);
    82.   InfoPanel.BevelInner := bvRaised;
    83.   InfoPanel.BevelOuter := bvLowered;
    84.   InfoCaption := TNewStaticText.Create(WizardForm);
    85.   InfoCaption.Parent := WizardForm.SelectComponentsPage;
    86.   InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
    87.   InfoCaption.Left := ScaleX(7);
    88.   InfoCaption.Top := InfoPanel.Top - ScaleY(6);
    89.   InfoCaption.Font.Color := clActiveCaption;
    90.  
    91.   Info := TNewStaticText.Create(WizardForm);
    92.   Info.Parent := InfoPanel;
    93.   Info.AutoSize := False;
    94.   Info.Left := ScaleX(6);
    95.   Info.Width := ScaleX(403);
    96.   Info.Top := ScaleY(12);
    97.   Info.Height := ScaleY(24);
    98.   Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
    99.   Info.WordWrap := true;
    100.  
    101.   AddDescription(1, 'Справка'); //первый параметр - это номер компонента, идет последовательно от начала записи компонентов
    102.   AddDescription(2, 'Английская справка'); //Второй параметр - это собственно описание компонента
    103.   AddDescription(3, 'Русская справка');
    104.   AddDescription(4, 'Плагины');
    105.   AddDescription(5, 'Внутреннего просмотра');
    106.   AddDescription(6, 'Архиваторные');
    107.   AddDescription(7, 'Системные');
    108.   AddDescription(8, 'CanonCam');
    109.   AddDescription(9, 'PluginManager');
    110.   AddDescription(10, 'Registry');
    111.   AddDescription(11, 'Services');
    112.   AddDescription(12, 'StartupGuard');
    113.   AddDescription(13, 'Другие');
    114.  
    115. end;
     
    Paul, Nemko, Grizla и ещё 1-му нравится это.
  5. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как внести значение в INI-файл в зависимости от выбранного чекбокса
    О: Так
    Код (Text):
    1. [Setup]
    2. AppName=My Program
    3. AppVerName=My Program 1.5
    4. AppPublisher=My Company, Inc.
    5. DefaultDirName={pf}\My Program
    6. DefaultGroupName=My Program
    7. OutputBaseFilename=setup
    8. Compression=lzma
    9. SolidCompression=yes
    10.  
    11. [Languages]
    12. Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
    13.  
    14. [Run]
    15. Filename: "{app}\MyProg"; Description: "{cm:LaunchProgram, MyProg}"; Flags: nowait postinstall skipifsilent
    16.  
    17. [Code]
    18. var
    19. IniCheckBox: TCheckBox;
    20.  
    21. procedure InitializeWizard();
    22. begin
    23.   IniCheckBox:= TCheckBox.Create(WizardForm);
    24.   IniCheckBox.Left:= WizardForm.RunList.Left + 4;
    25.   IniCheckBox.Top:= WizardForm.RunList.Top + 10;
    26.   IniCheckBox.Width:= WizardForm.RunList.Width;
    27.   IniCheckBox.Height:= 14
    28.   IniCheckBox.Caption:=' Изменить язык интерфейса на русский';
    29.   IniCheckBox.Parent:= WizardForm.FinishedPage;
    30. end;
    31.  
    32. procedure DeinitializeSetup();
    33. begin
    34.   if WizardForm.CurPageID = WpFinished then
    35.   begin
    36.     if IniCheckBox.Checked then
    37.       SetIniString('Setting','Language', 'RU',ExpandConstant('{app}\Language.ini'))     //Секция, подключ, значение, файл Ini
    38.     else
    39.       SetIniString('Setting','Language', 'EN',ExpandConstant('{app}\Language.ini'))
    40.   end;
    41. end;
     
    Paul, Nemko, Infest и ещё 1-му нравится это.
  6. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как удалить кнопки свернуть, развернуть из окна инсталлятора?
    О: Так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVerName=MyApp
    4. DefaultDirname={pf}\MyApp
    5.  
    6. [code]
    7. const
    8.   GWL_STYLE = -16;
    9.  
    10.   WS_MINIMIZEBOX = $20000;
    11.   WS_MAXIMIZEBOX = $10000;
    12.  
    13. function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
    14. function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
    15.  
    16. procedure initializeWizard();
    17. begin
    18.   SetWindowLong(WizardForm.handle, GWL_STYLE, GetWindowLong(WizardForm.handle, GWL_STYLE)and(not WS_MINIMIZEBOX)and(not WS_MAXIMIZEBOX));
    19. end;
     
    Paul, Nemko, Craj и 3 другим нравится это.
  7. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как динамически создать батник?
    О: Примерно так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVername=MyApp
    4. DefaultDirName={pf}\MyApp
    5. DisableWelcomePage=True
    6.  
    7. [code]
    8. procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
    9. begin
    10.   Confirm:= False;
    11.   Cancel:= True;
    12. end;
    13.  
    14. function InitializeSetup(): Boolean;
    15. var List: TStringList; src, dest, bat: string; res: Integer;
    16. begin
    17.   src:= ExpandConstant('{src}');
    18.   BrowseForFolder('Choose destination dir', dest, True);
    19.   bat:= ExpandConstant('{userappdata}\exec.bat');
    20.   List:= TStringList.Create;
    21.   List.Add('echo off');
    22.   List.Add('set src='+src);
    23.   List.Add('set dest='+dest);
    24.   List.Add('@echo SourceDir: "%src%"');
    25.   List.Add('@echo DestinationDir: "%dest%"');
    26.   List.Add('pause');
    27.   List.Add('del "'+bat+'"');
    28.   List.Add('pause');
    29.   List.SaveToFile(bat);
    30.   List.Free;
    31.   Exec(bat, '', '', SW_SHOW, ewNoWait, Res);
    32. end;
     
    Paul, Loner, Craj и ещё 1-му нравится это.
  8. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как добавить проверку свободного/необходимого места на жестком диске?
    О: Так
    Код (Text):
    1. #define NeedSize 4380
    2. #define NeedInstallSize 7890
    3.  
    4. [Setup]
    5. AppName=MyApp
    6. AppVerName=MyApp
    7. DefaultDirname={pf}\MyApp
    8.  
    9. [code]
    10. var
    11.   TotalSpaceLabel, FreeSpaceLabel, NeedSpacelabel, InstallSpaceLabel: TLabel;
    12.   FreeMB, TotalMB: Cardinal;
    13.  
    14. function NumToStr(Float: Extended): String;
    15. begin
    16.   Result:= Format('%.2f', [Float]);
    17.   StringChange(Result, ',', '.');
    18.   while ( Pos('.', Result) > 0 ) and ( (Result[Length(Result)] = '0') or (Result[Length(Result)] = '.') ) do
    19.     SetLength(Result, Length(Result) - 1);
    20. end;
    21.  
    22. function MbOrTb(Float: Extended): String;
    23. begin
    24.   if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
    25.     if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
    26.       Result:= NumToStr(Float/(1024*1024))+' Тб';
    27. end;
    28.  
    29. procedure DirEditOnChange(Sender: TObject);
    30. var Drive: String;
    31. begin
    32.   Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
    33.   GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
    34.   TotalSpaceLabel.Caption:= 'Всего места на диске: '+MbOrTb(TotalMB);
    35.   FreeSpaceLabel.Caption:= 'Доступно места на диске: '+MbOrTb(FreeMB)+' ('+IntToStr(round(FreeMB*100/TotalMB))+'%)';
    36.   InstallSpacelabel.Caption:= 'Требуется места для установки: '+MbOrTb({#NeedInstallSize});
    37.   NeedSpaceLabel.Caption:= 'Требуется места на диске: '+MbOrTb({#NeedSize});
    38.   WizardForm.NextButton.Enabled:= (FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize});
    39. end;
    40.  
    41. procedure InitializeWizard();
    42. begin
    43.   TotalSpaceLabel:= TLabel.Create(WizardForm);
    44.   TotalSpaceLabel.AutoSize:= False;
    45.   TotalSpaceLabel.SetBounds(0, 120, 300, 20);
    46.   TotalSpaceLabel.Parent:= WizardForm.SelectDirpage;
    47.  
    48.   FreeSpaceLabel:= TLabel.Create(WizardForm);
    49.   FreeSpaceLabel.AutoSize:= False;
    50.   FreeSpaceLabel.SetBounds(0, 140, 300, 20);
    51.   FreeSpaceLabel.Parent:= WizardForm.SelectDirpage;
    52.  
    53.   InstallSpacelabel:= TLabel.Create(WizardForm);
    54.   InstallSpacelabel.AutoSize:= False;
    55.   InstallSpacelabel.SetBounds(0, 160, 300, 20);
    56.   InstallSpacelabel.Parent:= WizardForm.SelectDirpage;
    57.  
    58.   NeedSpaceLabel:= TLabel.Create(WizardForm);
    59.   NeedSpaceLabel.AutoSize:= False;
    60.   NeedSpaceLabel.SetBounds(0, 180, 300, 20);
    61.   NeedSpaceLabel.Parent:= WizardForm.SelectDirpage;
    62.  
    63.   WizardForm.DirEdit.OnChange:=@DirEditOnChange;
    64. end;
    65.  
    66. procedure CurPageChanged(CurPageID: Integer);
    67. begin
    68.   if CurPageID=wpSelectDir then begin
    69.     DirEditOnChange(nil)
    70.   end;
    71. end;
     
    Paul, Craj, Gabriel и 5 другим нравится это.
  9. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как получить определенное значение из INI-файла?
    О: Так. Здесь 2 примера
    Код (Text):
    1. [Setup]
    2. AppName={code:GetAppName}
    3. AppVerName=My Program 1.5
    4. AppPublisher=My Company, Inc.
    5. DefaultDirName={pf}\My Program
    6. DefaultGroupName=My Program
    7. OutputBaseFilename=setup
    8.  
    9. [Languages]
    10. Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
    11.  
    12. [code]
    13. var
    14.   IniValue, IniFile: String;
    15.  
    16. //Для получения значения в другую секцию
    17. function GetAppName(IniFile: String): String;
    18. begin
    19.   IniFile:='G:\Name.ini'
    20.   IniValue:= GetIniString('ModuleName', 'AppName', '', IniFile);
    21.   Result := IniValue
    22. end;
    23.  
    24. //Просто получение значения
    25. procedure InitializeWizard();
    26. begin
    27.   IniFile:='G:\Name.ini'
    28.   IniValue:= GetIniString('ModuleName'{Название секции}, 'AppName'{Подключ}, '', IniFile{Ini файл});
    29.   WizardForm.WelcomeLabel2.Caption := IniValue;
    30. end;
     
    Paul и Craj нравится это.
  10. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    Q: Как растянуть картинку на первой и последней странице?
    A: Примерно так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVerName=MyApp
    4. DefaultDirname={pf}\MyApp
    5.  
    6. [code]
    7. var
    8.   WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
    9.   PageNameLabel, PageDescriptionLabel: TLabel;
    10.  
    11. procedure InitializeWizard();
    12. begin
    13.   WizardForm.WizardBitmapImage.Width := ScaleX(497);
    14.   WizardForm.WizardBitmapImage2.Width := ScaleX(497);
    15.  
    16.   { WelcomeLabel1 }
    17.   WizardForm.WelcomeLabel1.Hide;
    18.   WelcomeLabel1 := TLabel.Create(WizardForm);
    19.   with WizardForm.WelcomeLabel1 do
    20.   begin
    21.     WelcomeLabel1.Parent := Parent;
    22.     WelcomeLabel1.SetBounds(Left, Top, Width, Height);
    23.     WelcomeLabel1.AutoSize := AutoSize;
    24.     WelcomeLabel1.Font := Font;
    25.     WelcomeLabel1.Font.Color := clWhite;
    26.     WelcomeLabel1.Transparent := True;
    27.     WelcomeLabel1.WordWrap := WordWrap;
    28.     WelcomeLabel1.Caption := Caption;
    29.   end;
    30.  
    31.   { WelcomeLabel2 }
    32.   WizardForm.WelcomeLabel2.Hide;
    33.   WelcomeLabel2 := TLabel.Create(WizardForm);
    34.   with WizardForm.WelcomeLabel2 do
    35.   begin
    36.     WelcomeLabel2.Parent := Parent;
    37.     WelcomeLabel2.SetBounds(Left, Top, Width, Height);
    38.     WelcomeLabel2.AutoSize := AutoSize;
    39.     WelcomeLabel2.Font := Font;
    40.     WelcomeLabel2.Font.Color := clWhite;
    41.     WelcomeLabel2.Transparent := True;
    42.     WelcomeLabel2.WordWrap := WordWrap;
    43.     WelcomeLabel2.Caption := Caption;
    44.   end;
    45.  
    46.   WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);
    47.  
    48.   { PageNameLabel }
    49.   WizardForm.PageNameLabel.Hide;
    50.   PageNameLabel := TLabel.Create(WizardForm);
    51.   with WizardForm.PageNameLabel do
    52.   begin
    53.     PageNameLabel.Parent := Parent;
    54.     PageNameLabel.SetBounds(Left, Top, Width, Height);
    55.     PageNameLabel.AutoSize := AutoSize;
    56.     PageNameLabel.Font := Font;
    57.     PageNameLabel.Font.Color := clWhite;
    58.     PageNameLabel.Transparent := True;
    59.     PageNameLabel.WordWrap := WordWrap;
    60.   end;
    61.  
    62.   { PageDescriptionLabel }
    63.   WizardForm.PageDescriptionLabel.Hide;
    64.   PageDescriptionLabel:= TLabel.Create(WizardForm);
    65.   with WizardForm.PageDescriptionLabel do
    66.   begin
    67.     PageDescriptionLabel.Parent := Parent;
    68.     PageDescriptionLabel.SetBounds(Left, Top, Width, Height);
    69.     PageDescriptionLabel.AutoSize := AutoSize;
    70.     PageDescriptionLabel.Font := Font;
    71.     PageDescriptionLabel.Font.Color := clWhite;
    72.     PageDescriptionLabel.Transparent := True;
    73.     PageDescriptionLabel.WordWrap := WordWrap;
    74.   end;
    75.  
    76.   { FinishedHeadingLabel }
    77.   WizardForm.FinishedHeadingLabel.Hide;
    78.   FinishedHeadingLabel := TLabel.Create(WizardForm);
    79.   with WizardForm.FinishedHeadingLabel do
    80.   begin
    81.     FinishedHeadingLabel.Parent := Parent;
    82.     FinishedHeadingLabel.SetBounds(Left, Top, Width, Height);
    83.     FinishedHeadingLabel.AutoSize := AutoSize;
    84.     FinishedHeadingLabel.Font := Font;
    85.     FinishedHeadingLabel.Font.Color := clWhite;
    86.     FinishedHeadingLabel.Transparent := True;
    87.     FinishedHeadingLabel.WordWrap := WordWrap;
    88.     FinishedHeadingLabel.Caption := Caption;
    89.   end;
    90.  
    91.   { FinishedLabel }
    92.   WizardForm.FinishedLabel.Hide;
    93.   FinishedLabel := TLabel.Create(WizardForm);
    94.   with WizardForm.FinishedLabel do
    95.   begin
    96.     FinishedLabel.Parent := Parent;
    97.     FinishedLabel.SetBounds(Left, Top, Width, Height);
    98.     FinishedLabel.AutoSize := AutoSize;
    99.     FinishedLabel.Font := Font;
    100.     FinishedLabel.Font.Color := clWhite;
    101.     FinishedLabel.Transparent := True;
    102.     FinishedLabel.WordWrap := WordWrap;
    103.   end;
    104. end;
    105.  
    106. procedure CurPageChanged(CurPageID: Integer);
    107. begin
    108.   PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
    109.   PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
    110.   FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
    111. end;
     
    Craj нравится это.
  11. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как добавить проценты установки на страницу инсталляции?
    О: Так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVerName=MyApp
    4. DefaultDirName={pf}\MyApp
    5.  
    6. [Files]
    7. Source: compiler:innocallback.dll; Flags: dontcopy
    8. Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs
    9.  
    10. [code]
    11. type
    12.     TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
    13.  
    14. var
    15.   PercentsTimer: LongWord;
    16.   PercentsLabel: TLabel;
    17.  
    18. function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
    19. function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
    20. function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
    21.  
    22. Function NumToStr(Float: Extended): String;
    23. Begin
    24.     Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
    25.     while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
    26.         SetLength(Result, Length(Result)-1);
    27. End;
    28.  
    29. Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
    30. Begin
    31.   with WizardForm.ProgressGauge do
    32.   begin
    33.     PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
    34.   end;
    35. End;
    36.  
    37. procedure DeinitializeSetup();
    38. begin
    39.     KillTimer(0, PercentsTimer);
    40. end;
    41.  
    42. procedure InitializeWizard();
    43. begin
    44.     PercentsLabel:= TLabel.Create(WizardForm);
    45.   with PercentsLabel do
    46.   begin
    47.     Left:= WizardForm.ProgressGauge.Left;
    48.     Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
    49.     Width:= WizardForm.StatusLabel.Width;
    50.     Height:= WizardForm.StatusLabel.Height;
    51.     AutoSize:= False;
    52.     Transparent := True;
    53.     Parent:= WizardForm.InstallingPage;
    54.    end;
    55. end;
    56.  
    57. procedure CurStepChanged(CurStep: TSetupStep);
    58. begin
    59.   if CurStep = ssInstall then
    60.   begin
    61.   PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
    62.   end;
    63. end;
     
    Paul, Kotyarko_O, aCHIVKA и ещё 1-му нравится это.
  12. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как добавить TMemo на страницу установки, в котором будут отображаться извлекаемые файлы?
    О: Примерно так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVerName=MyApp
    4. DefaultDirName={pf}\MyApp
    5.  
    6. [Files]
    7. Source: E:\Program\Inno Setup 5.3.8 Ext\*; DestDir: {app}; BeforeInstall: AddToMemo; Flags: nocompression recursesubdirs createallsubdirs
    8.  
    9. [Code]
    10. var
    11.   FilesMemo: TNewMemo;
    12.  
    13. procedure AddToMemo();
    14. var
    15.   AFile: String;
    16. begin
    17.   AFile := ExpandConstant(CurrentFilename);
    18.   if ExtractFileExt(AFile) = '' then
    19.     FilesMemo.Lines.Add('CreateFolder: ' + RemoveBackslash(AFile))
    20.   else
    21.     FilesMemo.Lines.Add('Extract: ' + AFile);
    22. end;
    23.  
    24. procedure InitializeWizard();
    25. begin
    26.   FilesMemo := TNewMemo.Create(WizardForm);
    27.   FilesMemo.SetBounds(ScaleX(0), ScaleY(80), ScaleX(418), ScaleY(120));
    28.   FilesMemo.WordWrap := False;
    29.   FilesMemo.Parent := WizardForm.InstallingPage;
    30.   FilesMemo.ScrollBars := ssVertical;
    31.   FilesMemo.ReadOnly := True;
    32.   FilesMemo.Clear;
    33. end;
     
    Paul, Nemko, Хамик и ещё 1-му нравится это.
  13. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как сделать проверку на количество извлеченных файлов?
    О: Так
    Код (Text):
    1. #define CountFiles "3"
    2.  
    3. [Setup]
    4. AppName=MyApp
    5. AppVerName=MyApp
    6. DefaultDirName={pf}\MyApp
    7.  
    8. [code]
    9. function GetFilesCount(Dir: String): Integer;
    10. var
    11. FSR: TFindRec;
    12. FindResult: Boolean;
    13. begin
    14.   try
    15.     FindResult:= FindFirst(AddBackslash(Dir)+'*.*', FSR);
    16.     repeat
    17.       if ((FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = 0) then begin
    18.         Result:= Result+1;
    19.       end else
    20.       if ((FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY)and((FSR.Name<>'.')and(FSR.Name<>'..')) then begin
    21.         Result:=GetFilesCount(AddBackslash(Dir)+FSR.Name);
    22.       end;
    23.       FindResult:= FindNext(FSR);
    24.     until not FindResult
    25.   finally
    26.     FindClose(FSR);
    27.   end;
    28. end;
    29.  
    30. procedure CurStepChanged(CurStep: TSetupStep);
    31. var Res: Integer;
    32. begin
    33. if CurStep = ssPostInstall then begin
    34.   If GetFilesCount(ExpandConstant('{app}')) <{#CountFiles} then
    35.     If MsgBox(ExpandConstant('{cm:Error}'), mbCriticalError , MB_OK) = IDOK then
    36.       Exec(ExpandConstant('{uninstallexe}'), '/Silent', '', SW_SHOW, ewWaitUntilterminated, Res)
    37. end;
    38. end;
    39.  
    40. [CustomMessages]
    41. Error=Во время распаковки были распакованы не все файлы!
     
    Paul, Kotyarko_O и Craj нравится это.
  14. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как добавить свой шрифт в инсталлятор?
    О: Так
    Код (Text):
    1. #define Font "Edisson.ttf"
    2. #define FontName "Edisson"
    3.  
    4. [Files]
    5. Source: {#Font}; Flags: dontcopy
    6.  
    7. [code]
    8. #ifdef UNICODE
    9.     #define A "W"
    10. #else
    11.     #define A "A"
    12. #endif
    13.  
    14. const
    15.     FR_PRIVATE = $10;
    16.  
    17. function AddFontResource(lpszFilename: String; fl, pdv: DWORD): Integer; external 'AddFontResourceEx{#A}@gdi32.dll stdcall';
    18. function RemoveFontResource(lpFileName: String; fl, pdv: DWORD): BOOL; external 'RemoveFontResourceEx{#A}@gdi32.dll stdcall';
    19.  
    20. procedure InitializeWizard();
    21. begin
    22.     if not FontExists('{#FontName}') then
    23.     begin
    24.         ExtractTemporaryFile('{#Font}');
    25.         AddFontResource(ExpandConstant('{tmp}\{#Font}'), FR_PRIVATE, 0);
    26.     end;
    27.     WizardForm.Font.Name := '{#FontName}';
    28. end;
    29.  
    30. procedure DeinitializeSetup();
    31. begin
    32.     RemoveFontResource(ExpandConstant('{tmp}\{#Font}'), FR_PRIVATE, 0);
    33.     WizardForm.Free;
    34. end;
     
    Paul, Craj, Shift85 и ещё 1-му нравится это.
  15. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как "прицепить" дополнительную форму к окну инсталлятора, чтобы при перемещении дополнительная форма двигалась вместе с окном инсталлятора?
    О: Примерно так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVerName=MyApp
    4. DefaultDirname={pf}\MyApp
    5.  
    6. [Files]
    7. Source: compiler:innocallback.dll; DestDir: {tmp}; Flags: dontcopy
    8.  
    9. [code]
    10. const
    11.   WM_MOVE = $3;
    12.  
    13.   GWL_WNDPROC = -4;
    14.  
    15. type
    16.   TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;
    17.  
    18. function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
    19. function WndProcCallBack(P:TCallbackProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
    20. function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
    21. function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';
    22.  
    23. var
    24. Form1: TForm;
    25. OldProc: Longint;
    26.  
    27. function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
    28. begin
    29.   if Msg=WM_MOVE then SetWindowPos(Form1.Handle, 0, WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 0, 0, $415);
    30.   Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
    31. end;
    32.  
    33. procedure InitializeWizard();
    34. begin
    35.   Form1:= TForm.Create(MainForm);
    36.   Form1.SetBounds(WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 100, 358);
    37.   Form1.BorderStyle:= bsSingle;
    38.   Form1.Show;
    39.  
    40.   OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc, 4));
    41. end;
    42.  
    43. procedure DeinitializeSetup();
    44. begin
    45.   SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
    46. end;
     
    agent555, Timick и Craj нравится это.
  16. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Я использовал предыдущий пример Как теперь сделать чтобы при перемещении доп. формы двигалась и основная форма?
    О: Так, данный пример на основе предыдущего примера
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVerName=MyApp
    4. DefaultDirname={pf}\MyApp
    5.  
    6. [Files]
    7. Source: compiler:innocallback.dll; DestDir: {tmp}; Flags: dontcopy
    8.  
    9. [code]
    10. type
    11.   TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;
    12.  
    13. const
    14.   WM_MOVE = $3;
    15.   WM_ACTIVATE = $6;
    16.   WM_CLOSE = $10;
    17.   WM_NCACTIVATE = $86;
    18.  
    19.   GWL_WNDPROC = -4;
    20.  
    21. function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
    22. function WndProcCallBack(P:TCallbackProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
    23. function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
    24. function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';
    25.  
    26. var
    27. Form1: TForm;
    28. OldProc, OldProc1: Longint;
    29.  
    30. function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
    31. begin
    32.   if Msg=WM_MOVE then SetWindowPos(Form1.Handle, 0, WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 0, 0, $415);
    33.   Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
    34.   if Msg=WM_ACTIVATE then SendMessage(Form1.Handle, WM_NCACTIVATE, 1, 0);
    35. end;
    36.  
    37. function MyProc1(h: HWND; Msg, wParam, lParam: longint): Longint;
    38. begin
    39.   if Msg=WM_MOVE then begin
    40.     SetWindowPos(WizardForm.Handle, 0, Form1.Left-(WizardForm.Width+5), Form1.Top, 0, 0, $415);
    41.   end;
    42.   if Msg=WM_CLOSE then begin
    43.     SendMessage(WizardForm.handle, WM_CLOSE, 0, 0);
    44.     Exit;
    45.   end;
    46.   Result:= CallWindowProc(OldProc1, h, Msg, wParam, lParam);
    47.   if Msg=WM_ACTIVATE then SendMessage(WizardForm.Handle, WM_NCACTIVATE, 1, 0);
    48. end;
    49.  
    50.  
    51. procedure InitializeWizard();
    52. begin
    53.   Form1:= TForm.Create(MainForm);
    54.   Form1.SetBounds(WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 160, WizardForm.Height);
    55.   Form1.BorderStyle:= bsSingle;
    56.   Form1.Show;
    57.  
    58.   OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc, 4));
    59.   OldProc1:= SetWindowLong(Form1.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc1, 4))
    60. end;
    61.  
    62. procedure DeinitializeSetup();
    63. begin
    64.   SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
    65.   SetWindowlong(Form1.Handle, GWL_WNDPROC, OldProc1);
    66. end;
     
    Timick и Craj нравится это.
  17. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    756
    Симпатии:
    1.108
    Пол:
    Мужской
    В: Как разрешить установку продукта только на диск с файловой системой NTFS?
    О: Так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVername=MyApp
    4. DefaultDirName={pf}\MyApp
    5.  
    6. [code]
    7. #ifdef UNICODE
    8.   #define A "W"
    9. #else
    10.   #define A "A"
    11. #endif
    12.  
    13. function GetVolumeInformation(PathName, VolumeName: PAnsiChar; VolumeNameSize, VolumeSerialNumber, MaxComponentLength, FileSystemFlags: Longint; FileSystemName: PAnsiChar; FileSystemNameSize: Longint): Longint;
    14.   external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
    15.  
    16. function NextButtonClick(CurPageID: Integer): Boolean;
    17. var VolumeName, FileSystemName: String;
    18.     VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
    19. begin
    20.   Result := True;
    21.   if CurPageID = wpSelectDir then begin
    22.     FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
    23.     GetVolumeInformation(PAnsiChar(ExtractFileDrive(WizardForm.DirEdit.Text)+'\'), PAnsiChar(VolumeName), 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, PAnsiChar(FileSystemName), 31);
    24.     if Pos('NTFS', FileSystemName)=0 then begin
    25.       MsgBox('Установка данного продукта возможна только на диск с файловой системой NTFS.'#13'Пожалуйста, измените путь установки.', mbError, mb_Ok);
    26.       Result := False ;
    27.     end;
    28.   end;
    29. end;
     
    Craj нравится это.
  18. Пользователь Проверенный

    Регистрация:
    15 июн 2011
    Сообщения:
    42
    Симпатии:
    34
    В: Как запретить установку в папку с русскими буквами?
    О: Вот так: (Самый быстрый вариант от VoLT)
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVername=MyApp
    4. DefaultDirName={pf}\MyApp
    5.  
    6. [Code]
    7. function IsAnsi(S: String): Boolean;
    8. var
    9.   S1, S2: string;
    10. begin
    11.   S1 := AnsiUppercase(S);
    12.   S2 := Uppercase(S);
    13.   if CompareStr(S1, S2) = 0 then
    14.   begin
    15.     S1 := Lowercase(S);
    16.     S2 := AnsiLowercase(S);
    17.     if CompareStr(S1, S2) = 0 then
    18.       Result := True;
    19.   end;
    20. end;
    21.  
    22. function NextButtonClick(CurPageID: Integer): Boolean;
    23. begin
    24.   Result := True;
    25.   if CurPageID = wpSelectDir then
    26.   if not(IsAnsi(WizardForm.DirEdit.Text)) then
    27.   begin
    28.     MsgBox( 'В пути установки присуствуют русские символы'#13#13'Пожалуйста, повторите ввод.', mbError, mb_Ok);
    29.     Result := False;
    30.   end;
    31. end;
     
    ajiger, Craj, Kaktus и 4 другим нравится это.
  19. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.327
    Симпатии:
    867
    В: Как установить приоритет для инсталлятора?
    О: Так
    Код (Text):
    1. [Setup]
    2. AppName=MyApp
    3. AppVername=MyApp
    4. DefaultDirName={pf}\MyApp
    5.  
    6. [code]
    7.  
    8. const
    9.   NORMAL_PRIORITY_CLASS           = $00000020;
    10.   IDLE_PRIORITY_CLASS             = $00000040;
    11.   HIGH_PRIORITY_CLASS             = $00000080;
    12.   REALTIME_PRIORITY_CLASS         = $00000100;
    13.  
    14. function SetPriorityClass(hProcess: THandle; dwPriorityClass: DWORD): BOOL;
    15.   external 'SetPriorityClass@kernel32';
    16.  
    17. function GetCurrentProcess: THandle;
    18.   external 'GetCurrentProcess@kernel32';
    19.  
    20. procedure InitializeWizard();
    21. begin
    22.   SetPriorityClass(GetCurrentProcess, IDLE_PRIORITY_CLASS);     //установка приоритета для инсталлятора.
    23. end;
     
    EzzEldin16, Carlos, DICI BF и 4 другим нравится это.
  20. Пользователь

    Регистрация:
    5 авг 2011
    Сообщения:
    1
    Симпатии:
    12
    В: Меняем стандартный вид папки на иконку установленной программы как в меню "Пуск" так и в "пути" установки.
    image.png
    О: Архив со скриптом и необходимыми файлами во вложении.
     

    Вложения:

    Devils Night, Comancheros, Craj и 9 другим нравится это.

Поделиться этой страницей