Вопрос Динамическая смена изображений

Cyberworm

Новичок
Добрый вечер. Относительно недавно начал работать с Inno Setup и сразу же созрел вопрос, который возможно заинтересует и других обитателей. Как к компоненту из списка можно прикрепить изображение? Ведь при смене выбора компонента меняется само изображение (демонстрируется нужный пример).

Вопрос.jpg

Понятно только одно, что при клике на компонент из секции GroupDescription отрабатывается какая-то функция, которая закреплена за данными файлами. Хотелось бы разобрать данную функцию для будущих проектов Inno Setup VCL, как и размещение кастомных изображений на странице [Tasks]. Заранее выражаю благодарность за какую-либо помощь.
 

Yaroslav950

Участник
Nemko, на танках приводил пример(скрипт). можно с использованием ботвы.
 

Cyberworm

Новичок
Как пример. Не конечное решение!
Спасибо огромное за помощь. С размещением и оптимизацией изображений bmp разобрался, но допустим я хочу использовать три варианта шрифтов на выбор (как на скриншоте чуть ниже).

Пример.jpg

Можете помочь с этим условием для правильной работы procedure OnTaskClick(Sender: TObject); ?
 

HandyMan

Новичок
Код:
[Tasks]
Name: medium; Description: "по умолчанию"; Flags: exclusive
Name: big; Description: "увеличеные"; Flags: exclusive unchecked

procedure OnTaskClick(Sender: TObject);
begin

    if WizardIsTaskSelected('big') then
    begin
        FontBigBmp.Visible:=True;
        FontMediumBmp.Visible:=False;
    end else
    if WizardIsTaskSelected('medium') then
    begin
        FontMediumBmp.Visible:=True;
        FontBigBmp.Visible:=False;  
    end;
     
end;

procedure InitializeWizard();
begin
    WizardForm.TasksList.OnClickCheck:= @OnTaskClick;
end;
 
Последнее редактирование:

Cyberworm

Новичок
Код:
[Tasks]
Name: medium; Description: "по умолчанию"; Flags: exclusive
Name: big; Description: "увеличеные"; Flags: exclusive unchecked

procedure OnTaskClick(Sender: TObject);
begin

    if WizardIsTaskSelected('big') then
    begin
        FontBigBmp.Visible:=True;
        FontMediumBmp.Visible:=False;
    end else
    if WizardIsTaskSelected('medium') then
    begin
        FontMediumBmp.Visible:=True;
        FontBigBmp.Visible:=False; 
    end;
    
end;

procedure InitializeWizard();
begin
    WizardForm.TasksList.OnClickCheck:= @OnTaskClick;
end;
Этот вариант даже ещё лучше, потому что является универсальным и не зависит от лимита компонентов. Наверное я тут многих утомил, но теперь стоит другая задача: использовать png с прозрачностью заместо bmp. Плагин botva2.dll не вижу смысла использовать, потому что Inno Setup VCL по умолчанию поддерживает jpg и png. Я смотрел пример Example_PNG-JPG.iss из базового набора, но там идёт отрисовка всех примеров исключительно на кастомной странице. Мне бы хотелось понять каким-образом я могу отрисовать png на странице [Tasks] с теми условиями, как на моём скриншоте чуть выше.
 

Cyberworm

Новичок
В принципе вопрос закрыт после изучения списка страниц WizardForm, но HandyMan очень подсобил с логикой. Теперь всё работает как надо даже с прозрачностью.

Код:
[Setup]
AppName=Tasks Image (png)
AppVersion=1.0
OutputBaseFileName=Tasks Image (png)
WizardStyle=modern
DefaultDirName={pf}\Tasks Image (png)
ArchitecturesInstallIn64BitMode=x64
Compression=lzma2/ultra64
SolidCompression=yes
PrivilegesRequired=admin
AppendDefaultDirName=no
Uninstallable=Not(IsTaskSelected('NoUnins'))

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

[Files]
Source: Resource/Slim.png; DestDir: {tmp}; Flags: dontcopy 
Source: Resource/Medium.png; DestDir: {tmp}; Flags: dontcopy 
Source: Resource/Fat.png; DestDir: {tmp}; Flags: dontcopy

[Tasks]
Name: "NoUnins"; Description: "Не создавать деинсталлятор и не оставлять следов в системе"; MinVersion: 0.0,6.1sp1; Flags: unchecked
Name: "Slim"; Description: "Тонкие"; GroupDescription: "Выберите тип внутриигровых шрифтов:"; MinVersion: 0.0,6.1sp1; Flags: exclusive unchecked
Name: "Medium"; Description: "Баланс"; GroupDescription: "Выберите тип внутриигровых шрифтов:"; MinVersion: 0.0,6.1sp1; Flags: exclusive
Name: "Fat"; Description: "Толстые"; GroupDescription: "Выберите тип внутриигровых шрифтов:"; MinVersion: 0.0,6.1sp1; Flags: exclusive unchecked

[Code]
{ Переменные }
var
    PicImage, PicImage2, PicImage3: TImage;
    Slim, Medium, Fat: String;

{ Выбор активного изображения }
procedure OnTaskClick(Sender: TObject);
begin
    if WizardIsTaskSelected('Slim') then
    begin
        PicImage.Visible:=True;
        PicImage2.Visible:=False;
        PicImage3.Visible:=False;
    end else        
    if WizardIsTaskSelected('Medium') then
    begin
        PicImage2.Visible:=True;
        PicImage.Visible:=False;
        PicImage3.Visible:=False;
    end else        
    if WizardIsTaskSelected('Fat') then
    begin
        PicImage3.Visible:=True;  
        PicImage.Visible:=False;
        PicImage2.Visible:=False;
    end;     
end;

{ Процедура инициализации GUI программы установки }
procedure InitializeWizard();
begin
    with WizardForm.TasksList do
  begin
    Height := ScaleY(40);
  end;
    
  { Извлечение графических файлов во временный каталог }
  Slim := ExpandConstant('{tmp}\Slim.png');
  ExtractTemporaryFile(ExtractFileName(Slim));
  Medium := ExpandConstant('{tmp}\Medium.png');
  ExtractTemporaryFile(ExtractFileName(Medium));    
  Fat := ExpandConstant('{tmp}\Fat.png');
  ExtractTemporaryFile(ExtractFileName(Fat));
    
  // PNG из внешних файлов
  PicImage := TImage.Create(WizardForm);
  PicImage.AutoSize := True;
  PicImage.Picture.LoadFromFile(Slim);
  PicImage.Left := ScaleX(0);
  PicImage.Top := ScaleY(160);
  PicImage.Width := ScaleX(516);
  PicImage.Height := ScaleY(138);
  PicImage.Parent := WizardForm.SelectTasksPage;
    
  PicImage2 := TImage.Create(WizardForm);
  PicImage2.AutoSize := True;
  PicImage2.Picture.LoadFromFile(Medium);
  PicImage2.Left := ScaleX(0);
  PicImage2.Top := ScaleY(160);
  PicImage2.Width := ScaleX(516);
  PicImage2.Height := ScaleY(138);
  PicImage2.Parent := WizardForm.SelectTasksPage;
    
  PicImage3 := TImage.Create(WizardForm);
  PicImage3.AutoSize := True;
  PicImage3.Picture.LoadFromFile(Fat);
  PicImage3.Left := ScaleX(0);
  PicImage3.Top := ScaleY(160);
  PicImage3.Width := ScaleX(516);
  PicImage3.Height := ScaleY(138);
  PicImage3.Parent := WizardForm.SelectTasksPage;
    
  PicImage2.Show;
  WizardForm.TasksList.OnClickCheck:= @OnTaskClick;
end;
 

Cyberworm

Новичок
Рано радовался... Всего скорей команда PicImage2.Show не работает при переходе на страницу [Tasks]

Пример.jpg

PicImage2.Show используется исключительно для файлов bmp или jpg, но для png надо менять условие. Только после ручного выбора (Тонкие/Баланс/Толстые) или нажатию на пустой чекбокс чуть выше происходит отрисовка по одному изображению и скрипт работает как надо. Кто-нибудь знает как это исправить? Буду рад любой помощи. Очень важно, чтобы при первом переходе на страницу [Tasks] был выбран второй вариант вывода изображения Medium.png, а остальные два временно были в инактиве, то есть не отображались до действий пользователя.
 

Andreo Fadio

Старожил
Кто-нибудь знает как это исправить?
Вы показываете пример, в котором и есть решение того что вы просите (нужно лишь расставить в нужных местах):
procedure InitializeWizard();
begin
............
// PNG из внешних файлов
PicImage := TImage.Create(WizardForm);
............
PicImage.Parent := WizardForm.SelectTasksPage;
PicImage.Visible:=False;

PicImage2 := TImage.Create(WizardForm);
............
PicImage2.Parent := WizardForm.SelectTasksPage;
PicImage2.Visible:=True;

PicImage3 := TImage.Create(WizardForm);
............
PicImage3.Parent := WizardForm.SelectTasksPage;
PicImage3.Visible:=False;
............
end;
 
Последнее редактирование:

HandyMan

Новичок
Как-то так...
Код:
procedure IsPictureVisile()
begin
    PicImage.Visible:=WizardIsTaskSelected('Slim');
    PicImage2.Visible:=WizardIsTaskSelected('Medium');
    PicImage3.Visible:=WizardIsTaskSelected('Fat');
end;

procedure OnTaskClickCheck(Sender: TObject);
begin
    IsPictureVisile;
end;

procedure InitializeWizard();
begin
  begin
    with WizardForm.TasksList do
  begin
    Height := ScaleY(40);
  end;
   
  { Извлечение графических файлов во временный каталог }
  Slim := ExpandConstant('{tmp}\Slim.png');
  ExtractTemporaryFile(ExtractFileName(Slim));
  Medium := ExpandConstant('{tmp}\Medium.png');
  ExtractTemporaryFile(ExtractFileName(Medium));  
  Fat := ExpandConstant('{tmp}\Fat.png');
  ExtractTemporaryFile(ExtractFileName(Fat));
   
  // PNG из внешних файлов
  PicImage := TImage.Create(WizardForm);
  PicImage.AutoSize := True;
  PicImage.Picture.LoadFromFile(Slim);
  PicImage.Left := ScaleX(0);
  PicImage.Top := ScaleY(160);
  PicImage.Width := ScaleX(516);
  PicImage.Height := ScaleY(138);
  PicImage.Parent := WizardForm.SelectTasksPage;
   
  PicImage2 := TImage.Create(WizardForm);
  PicImage2.AutoSize := True;
  PicImage2.Picture.LoadFromFile(Medium);
  PicImage2.Left := ScaleX(0);
  PicImage2.Top := ScaleY(160);
  PicImage2.Width := ScaleX(516);
  PicImage2.Height := ScaleY(138);
  PicImage2.Parent := WizardForm.SelectTasksPage;
   
  PicImage3 := TImage.Create(WizardForm);
  PicImage3.AutoSize := True;
  PicImage3.Picture.LoadFromFile(Fat);
  PicImage3.Left := ScaleX(0);
  PicImage3.Top := ScaleY(160);
  PicImage3.Width := ScaleX(516);
  PicImage3.Height := ScaleY(138);
  PicImage3.Parent := WizardForm.SelectTasksPage;
   
    IsPictureVisile;
    PicImage.Show;
  WizardForm.TasksList.OnClickCheck:= @OnTaskClickCheck;
end;
 

Cyberworm

Новичок
Спасибо всем за помощь, но сейчас вопрос малость другой и может для кого-то показаться довольно простым. Хочу оформить как минимум две формы Panel := TPanel.Create(Page); на кастомной странице. С размещением объектов StaticText := TNewStaticText.Create(Page); и PicImage := TImage.Create(Page); проблем нет, но как их сгруппировать по отдельности?
Необходимо, чтобы TPanel не закрывала собой текст и картинку с альфа-каналом в каждой группе. Пример желаемого результата чуть ниже.

Пример.jpg

Есть предположение, что в настройках размещения картинок PicImage.Parent и текста StaticText.Parent надо прописать конкретную форму для размещения внутри панельки. Тогда в настройках самих панелек надо прописывать какие-либо опции, которые влияют на отображение объектов внутри неё??
 

Andreo Fadio

Старожил
Есть предположение, что в настройках размещения картинок PicImage.Parent и текста StaticText.Parent надо прописать конкретную форму для размещения внутри панельки.
это не предложение, а то что вам надо сделать.
Тогда в настройках самих панелек надо прописывать какие-либо опции, которые влияют на отображение объектов внутри неё??
Нужно указать размеры у элементов, которые будете размещать, чтобы они могли разместиться на данной панели
 
Сверху