Программирование: Параметр "Check"

Существует один необязательный параметр, поддерживаемый всеми секциями, записи которых представляют собой набор параметров. Этим параметром является:

Check

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

Кроме прямого указания функции, допускается также использовать логические выражения. Смотрите примеры логических выражений в разделе справки "Параметры секций [Components] и [Tasks]".

Каждая проверочная функция может содержать параметры, разделённые запятыми, которые программа установки должна передать для проверки. Допустимыми типами параметров являются String (строковый), Integer (целочисленный) и Boolean (логический). Строковые параметры могут содержать константы. Эти константы не будут автоматически расширены. Если требуется передать расширенную константу, существует одна специальная поддерживаемая функция, которая может быть вызвана из списка параметров: ExpandConstant.

Пример:
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: MyProgCheck
Source: "A\MYFILE.TXT"; DestDir: "{app}"; Check: MyDirCheck(ExpandConstant('{app}\A')) 
Source: "B\MYFILE.TXT"; DestDir: "{app}"; Check: DirExists(ExpandConstant('{app}\B'))

Все проверочные функции должны возвращать значение типа Boolean (логический). Если проверочная функция (или логическое выражение) возвращает значение True, запись будет обработана, иначе пропущена.

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

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

Для записей секции [Files] с использованием символов подстановки (маски файлов), но без флага external, проверочная функция будет вызвана один раз для каждого файла, который соответствует маске, а не один раз для каждой записи. Используйте функцию CurrentFileName для проверки имени файла, обрабатываемого в текущий момент.

Ниже представлен пример секции [Code] с проверочной функцией, используемой в примере выше. Функция DirExists является поддерживаемой и поэтому сюда не включена.

[Code]
var
  MyProgChecked: Boolean;
  MyProgCheckResult: Boolean;

function MyProgCheck(): Boolean;
begin
  if not MyProgChecked then begin
    MyProgCheckResult := MsgBox('Вы хотите установить MyProg.exe в ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = IDYES;   
    MyProgChecked := True;
  end;
  Result := MyProgCheckResult;
end;

function MyDirCheck(DirName: String): Boolean;
begin
  Result := DirExists(DirName);
end;