Имя пользователя:
Пароль:
 | Правила  

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

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

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

Ветеран


Contributor


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


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

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


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


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

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

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

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

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

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

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


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

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

 

Аватара для Johny777

Ветеран


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

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


Эх Ваня...

в общем так
за основу взял "4 состояния"
1. Используется текстура размером 320х23, где размер одной кнопки 80х23
Теперь пофиг какая, тк картинка растягивается (только растягивать нужно в разумных пределах).
Главное чтоб были 4 кнопки одинакового размера с таким вот расположением картинок-состояний:
;обычное состояние - при наведении - при нажатии - заблокировано

2. тк картинка растягивается размеры кнопок больше не привязаны к константам
const
ButtonWidth = 80;
ButtonHeight = 23;
а это занчит, что кнопки могут быть отличными по размеру от ширины и высоты раздела тектстуры и друг от друга

3. сильно оптимизировал код:
убрал лишнее
переписал грамотнее
заменил процедуры наведения и "уведения" курсора мыши с кнопки (стали быстрее на глаз)

4. две текстуры для кнопок на месте как были

Результат:
читать дальше »
Код: Выделить весь код
;обычное состояние - при наведении - при нажатии - заблокировано
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=.
BitmapResource=button1:buttonA.bmp|button2:buttonB.bmp
LicenseFile=compiler:License.txt


[   Code]
var
  WizardLabel: TLabel;
  ButtonPanel: array of TPanel;
  ButtonImage: array of TBitmapImage;
  ButtonLabel: array of TLabel;
  UsedButtons: array of TButton;
  ButtonsCount: Integer;

procedure ButtonLabelClick(Sender: TObject);
var
  Button: TButton;
  n, i: Integer;
begin
  i:= TLabel(Sender).Tag;
  ButtonImage[i].Left := 0;
  for n:=0 to (ButtonsCount-1) do if i = n then Button:= UsedButtons[n];
  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:=-TLabel(Sender).Width*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelOnEnter(Sender: TObject);
var
  i: Integer;
begin
  i := TLabel(Sender).Tag;
  if (ButtonLabel[i].Enabled) then ButtonImage[i].Left:= -TLabel(Sender).Width;
end;

procedure ButtonLabelOnLeave(Sender: TObject);
var
  i: Integer;
begin
  i := TLabel(Sender).Tag;
  if (ButtonLabel[i].Enabled) then ButtonImage[i].Left := 0;
end;


procedure LoadButtonImage(AButton: TButton; Texture: Integer);
var
  n: Integer;
begin
  n := ButtonsCount;
  SetArrayLength(ButtonPanel, n+1);
  SetArrayLength(ButtonImage, n+1);
  SetArrayLength(ButtonLabel, n+1);
  SetArrayLength(UsedButtons, n+1);
  UsedButtons[n] := AButton;

  ButtonPanel[n]:=TPanel.Create(nil)
  with ButtonPanel[n] do
  begin
    SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height);
    Tag := n;
    Enabled := AButton.Enabled;
    Parent := AButton.Parent;
  end;

  ButtonImage[n]:=TBitmapImage.Create(nil)
  with ButtonImage[n] do
  begin
    SetBounds(ScaleX(0), ScaleY(0), AButton.Width*4, AButton.Height);
    Enabled:=False;
    Stretch := True;
    Parent:=ButtonPanel[n];
    if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
    if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');
  end;

  ButtonLabel[n]:=TLabel.Create(nil)
  with ButtonLabel[n] do
  begin
    Autosize := True;
    Alignment := taCenter;
    Tag := n;
    Enabled := AButton.Enabled;
    Transparent := True;
    Font.Color := clBlack;
    Caption := AButton.Caption;
    Parent := ButtonPanel[n];
  end;

  with TLabel.Create(nil) do
  begin
    Tag := n;
    Parent := ButtonPanel[n];
    Width := AButton.Width;
    Height := AButton.Height;
    Transparent := True;
    OnClick := @ButtonLabelClick;
    OnDblClick := @ButtonLabelClick;
    OnMouseEnter := @ButtonLabelOnEnter;
    OnMouseLeave := @ButtonLabelOnLeave;
    OnMouseDown := @ButtonLabelMouseDown;
    OnMouseUp := @ButtonLabelMouseUp;
  end;

  ButtonsCount := ButtonsCount + 1;
end;

procedure UpdateButtons();
var
  n: Integer;
begin
    for n:=0 to ButtonsCount-1 do
    begin
      with ButtonPanel[n] do
      begin
        Visible := UsedButtons[n].Visible;
        Enabled := UsedButtons[n].Enabled;
        Left:= UsedButtons[n].Left;
        Top:= UsedButtons[n].Top;
      end;
      
      with ButtonLabel[n] do
      begin
        Caption := UsedButtons[n].Caption;
        Enabled := UsedButtons[n].Enabled;
        Left := ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
        Top := ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
      end;
      
      if not UsedButtons[n].Enabled then ButtonImage[n].Left := - UsedButtons[n].Width*3 else ButtonImage[n].Left := 0;
    end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled:= True;
  UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled:= False;
  UpdateButtons()
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    Color := clWhite;
    LicenseAcceptedRadio.OnClick := @LicenceAcceptedRadioOnClick;
    LicenseNotAcceptedRadio.OnClick := @LicenceNotAcceptedRadioOnClick;
    
    NextButton.Width := ScaleX(60);
  end;

  LoadButtonImage(WizardForm.BackButton, 1)
  LoadButtonImage(WizardForm.NextButton, 1)
  LoadButtonImage(WizardForm.CancelButton, 2)
  LoadButtonImage(WizardForm.DirBrowseButton, 1)
  LoadButtonImage(WizardForm.GroupBrowseButton, 2)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  UpdateButtons();
  
  if CurPageID = wpFinished then
  begin
    ButtonPanel[1].Hide;
    WizardForm.NextButton.Left := ScaleX(60);
    LoadButtonImage(WizardForm.NextButton, 2);
    UpdateButtons;
  end;
end;


скрин:


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

==================== Важно!
читать дальше »

в изначальной версии этого скрипта тектурирование такое
сначала создаётся панель
на ней картинка
сверху лейбл прозрачный на всю панель на котрый мы: нажимаем, дважды нажимаем, наводим, уводим
а сверху другой по центру с надписью типа "Обзор" или "Далее "

так вот у двух последних лейблов и были эвенты : нажимаем, наводим, уводим
Почему?
да потому то что сначала создавался тот что на всю панель, а потом надпись и надпись ложилась сверху
у меня в коде этого нет, тк согдание идёт по порядку от begin до end;
те у меня сначала создаётся лейбл с надписью а потом другой - на всю панель - и он перекрывает тот
Если б не это то код выше был бы невозможен тк используется TLabel(Sender).Width
те берём размер посыльного лейбла
вот и получалось, что при наведении на большой всё в порядке, а при наведении на маленький ерунда

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

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

я говорю это потому что мне кажется это не все знают, а это важно!

Последний раз редактировалось Johny777, 16-08-2012 в 14:21.

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

Отправлено: 05:06, 16-08-2012 | #631



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

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


Аватара для Ivan_009

Ветеран


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

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


Johny777, а возможно или нет наложить изображение через bmp на чекбоксы

Последний раз редактировалось Ivan_009, 25-08-2012 в 14:17.


Отправлено: 14:29, 16-08-2012 | #632


Аватара для Johny777

Ветеран


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

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


Ivan_009, в шапке пример El Sanchez-а "Создание кастомного чекбокса"
а вообще думаю можно доработать текстурирование кнопок под эти цели
не уверен

Последний раз редактировалось Johny777, 16-08-2012 в 15:06.

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

Отправлено: 14:59, 16-08-2012 | #633


Аватара для Ivan_009

Ветеран


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

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


Как добавить крестик и кнопку свернуть вот сюда без использования ботвы подскажите кто знает заранее спасибо...

Последний раз редактировалось Ivan_009, 25-08-2012 в 14:17.


Отправлено: 00:22, 17-08-2012 | #634


Аватара для Johny777

Ветеран


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

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


Ivan_009,
3 способа:

1. использовать TNewButton с текстом "X" и "-"
(С текстурированием страницей назад можно добиться уровня 2-го способа)
код:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.


[  Code]
procedure Close_or_Minimize(Sender: TObject);
begin
  case TNewButton(Sender).Caption of
    'X': WizardForm.Close;
    '-': SendMessage(WizardForm.Handle,$112,61472,0);
  end;
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    OuterNotebook.Hide;
    BorderStyle := bsNone;
    Color := $506a5a;
  end;

  with TNewButton.Create(WizardForm) do
  begin
    Parent := WizardForm;
    SetBounds(WizardForm.Width - ScaleX(25),ScaleY(10),ScaleX(16),ScaleY(16));
    Caption := 'X';
    OnClick := @Close_or_Minimize;
    ShowHint := True;
    Hint := 'Закрыть';
  end;

  with TNewButton.Create(WizardForm) do
  begin
    Parent := WizardForm;
    SetBounds(WizardForm.Width - ScaleX(40),ScaleY(10),ScaleX(16),ScaleY(16));
    Caption := '-';
    OnClick := @Close_or_Minimize;
    ShowHint := True;
    Hint := 'Свернуть';
  end;
end;

2. использовать TNewSpeedButton с глифами (советую)
код:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

BitmapResource=Mini:min.bmp|Close:Close.bmp


[  Code]
procedure Close_or_Minimize(Sender: TObject);
begin
  case TNewSpeedButton(Sender).Hint of
    'Закрыть': WizardForm.Close;
    'Cвернуть': SendMessage(WizardForm.Handle,$112,61472,0);
  end;
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    OuterNotebook.Hide;
    BorderStyle := bsNone;
    Color := $506a5a;
  end;

  with TNewSpeedButton.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(WizardForm.Width - ScaleX(50),ScaleY(10),ScaleX(16),ScaleY(16));
    Glyph.LoadFromResourceName(HInstance, '_IS_MINI');
    ShowHint := True;
    Hint := 'Cвернуть';
    OnClick := @Close_or_Minimize;
  end;

  with TNewSpeedButton.Create(nil) do
  begin
    Parent := WizardForm;
    ThemeEnabled := False;
    SetBounds(WizardForm.Width - ScaleX(25),ScaleY(10),ScaleX(16),ScaleY(16));
    Glyph.LoadFromResourceName(HInstance, '_IS_CLOSE');
    ShowHint := True;
    Hint := 'Закрыть';
    OnClick := @Close_or_Minimize;
  end;
end;

архив с кодом и картинками-примерами: http://sendfile.su/650884

3. использовать ImageButton (лучший вариант), те картинку с событиями как при текстурировании
извиняй
рисованием мне сейчас заниматься некогда
так что сам попробуй разобрать, будут вопросы спрашивай
пример такой кнопки это: ...\Inno Setup 5\Examples\Example_MouseEvent_ImgBtn.iss
там и наведение и нажатие и пр.
можно такую кнопку навернуть...
... не хуже чем в аэро стиле семёрки (свечение)!
но не думаю, что стоит с ним заморачиваться, если только ты не делаешь инсталл типа StarCraft 2 за авторством South

Последний раз редактировалось Johny777, 17-08-2012 в 04:31.

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

Отправлено: 02:59, 17-08-2012 | #635


Аватара для ChVL

Старожил


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

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


Чтобы положить файлы в папку "Мои видеозаписи" устанавливаю путь к этой папке:
Код: Выделить весь код
[Сode]
const
MAX_PATH = 260; 
CSIDL_MYVIDEO = $0e; 
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;
Скрипт отрабатывает нормально, путь создаётся.
Прописываю путь к этой папке:
Код: Выделить весь код
[Files]
Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetSpecialPath}\MyProg
Компилятор, однако, ругается на ошибку в строке:
function GetSpecialPath(CSIDL: Word): string;
пишет:
Invalid prototype for 'GetSpecialPath'

Как правильно прописать?

Отправлено: 11:23, 17-08-2012 | #636


Аватара для Gnom_aka_Lexander

Ветеран


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

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


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

[Files]
Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetVideoPath}\MyProg

[*code]
const
  MAX_PATH = 260;
  CSIDL_MYVIDEO = $0e;
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 GetVideoPath(s: string): string;
begin
  Result:= GetSpecialPath(CSIDL_MYVIDEO);
end;

Протип выглядит так: function MyStrFunc(s: string): string;

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 11:49, 17-08-2012 | #637


Аватара для ChVL

Старожил


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

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


Gnom_aka_Lexander,
Компиляция прошла, однако что-то не срослось при установке программы:


Отправлено: 12:57, 17-08-2012 | #638


Аватара для R.i.m.s.k.y.

Ветеран


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

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


ChVL, может антивирь блокирует?

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 13:00, 17-08-2012 | #639


Аватара для ChVL

Старожил


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

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


Цитата R.i.m.s.k.y.:
может антивирь блокирует? »
У меня его нет в принципе.

Отправлено: 13:03, 17-08-2012 | #640



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

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

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




 
Переход