Установите два файла в выбранный пользователем каталог

Я хочу установить два файла в установочный каталог. Каталог выбирается пользователем во время установки и создается, если он не существует. Должен быть предложен путь по умолчанию.

Что у меня есть на данный момент:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
AppName=Testapp
AppVersion=1.0
DefaultDirName = {code:GetOtherDir}
DefaultGroupName=TestProgram
PrivilegesRequired = lowest
OutputBaseFilename =TestProgram

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

[Files]
Source: "program.exe"; DestDir: "{app}"
Source: "readme.txt";  Flags: onlyifdoesntexist; DestDir: "{app}"

[Icons]
Name: "{userdesktop}\Subdirectory"; Filename: "{userdocs}\Subdirectory\program.exe"; Tasks: desktopicon

[Code]
var
  OtherInputDirPage: TInputDirWizardPage;

procedure InitializeWizard;
begin
  OtherInputDirPage :=
    CreateInputDirPage(wpSelectDir, 'Installationsverzeichnis wählen:', '', '', False, '');
  OtherInputDirPage.Add('');
  // Set initial value (optional)
  OtherInputDirPage.Values[0] := ExpandConstant('{userdocs}\Subdirectory');
end;

function GetOtherDir(Param: String): String;
begin
  Result := OtherInputDirPage.Values[0];
end;

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

Зачем вы создаете OtherInputDirPage? Почему бы вам не использовать стандартную страницу «Выбор каталога»? + Какой "второй файл" не устанавливается? Выложите лог-файл.

Martin Prikryl 27.02.2024 07:08

Извините, но не могли бы вы указать мне какой-нибудь пример кода для стандартной страницы?

tfv 27.02.2024 07:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Код, который вы пытаетесь выполнить, кажется излишне сложным для такой тривиальной задачи. Базовый сценарий Inno Setup для установки двух файлов в выбранный пользователем каталог выглядит следующим образом:

[Setup]
AppName=My Program
AppVersion=1.0
DefaultDirName = {autopf}\My Program

[Files]
Source: "program.exe"; DestDir: "{app}"
Source: "readme.txt"; DestDir: "{app}"

Возможно, вы запутались, поскольку приложение у вас уже установлено и стандартная страница выбора каталога не отображается. См.:
Программа установки, созданная Inno Setup, не отображает страницу «Выбрать место назначения» в некоторых системах

Комментарий Мартина Прикрыла был весьма полезен, и моя дополнительная проблема заключалась в том, что DisableDirPage=no отсутствовал, и поэтому диалоговое окно выбора каталога не отображалось, поскольку программа уже была установлена ​​один раз.

[Setup]
AppName=Test
AppVersion=1.0
DefaultDirName = {userdocs}\Testprogramdir
//DisableProgramGroupPage=yes
AlwaysShowDirOnReadyPage = yes
DisableDirPage = no
OutputDir=Output

[Files]
Source: "program.exe"; DestDir: "{app}"
Source: "readme.txt"; DestDir: "{app}"

[Code]
function NextButtonClick(CurPageID: Integer): Boolean;
var
  InstallDir: string;
begin
  Result := True;
  
  if CurPageID = wpSelectDir then begin
    InstallDir := WizardForm.DirEdit.Text;
    if not DirExists(InstallDir) then begin
      if not CreateDir(InstallDir) then begin
        MsgBox('Could not create installation directory.', mbError, MB_OK);
        Result := False;
      end;
    end;
    WizardForm.DirEdit.Text := InstallDir; // Update the directory edit field
  end;
end;

1) Зачем тебе DisableDirPage=no? 2) В чем смысл вашего NextButtonClick? Inno Setup создаст папку за вас. + Имхо, WizardForm.DirEdit.Text := InstallDir ничего не делает.

Martin Prikryl 27.02.2024 08:57

Основная проблема сложнее, так как я ищу способ адаптировать имя значка, но я открыл новую тему с уточненным вопросом по этому поводу: stackoverflow.com/questions/78095282/…

tfv 03.03.2024 07:04

Вот всё равно имхо не объясняет, для чего нужен ваш NextButtonClick.

Martin Prikryl 03.03.2024 08:15

Более того, если смысл DisableDirPage=no в том, что вы хотите установить одну и ту же программу несколько раз, то вы только скрываете проблему, заключающуюся в том, что вы устанавливаете все экземпляры с использованием одного и того же AppId, поэтому вы сможете установить только последнюю установленную копию.

Martin Prikryl 03.03.2024 08:17

Что касается NextButtonClick: поскольку я хотел изменить имя ссылки на рабочем столе, я понял, что мне нужна какая-то переменная в функции, которая извлекает имя из имени каталога и использует ее для изменения имени ссылки на рабочем столе. Единственный способ создать переменную — это функция, поэтому я начал с NextButtonClick. В конце концов я нашел более элегантный способ в другом посте.

tfv 03.03.2024 18:27

Что касается DisableDirPage=no: вы имеете в виду удалить последнюю копию? Меня это устраивает, я не являюсь активным пользователем, это быстрое и грязное решение довольно трудоемкой проблемы. Спасибо за вашу помощь!

tfv 03.03.2024 18:31

Что касается NextButtonClick – но значок на рабочем столе не является частью ЭТОГО вопроса. Так что функция NextButtonClick здесь только сбивает с толку.

Martin Prikryl 04.03.2024 07:32

Что касается DisableDirPage=no — если лично для вас вы предпочитаете быстрые и грязные решения, это ваш выбор, но если вы хотите предложить свое решение публично, вам следует хотя бы признать, что оно быстрое и грязное.

Martin Prikryl 04.03.2024 07:33

Другие вопросы по теме