Difference between revisions of "StandardOutputHook"

From SunFlurry wiki
Jump to: navigation, search
1>Admin
m (1 revision imported)
 
(No difference)

Latest revision as of 11:07, 25 September 2023

  StandardOutputHook (Системные функции)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку или число, функция не найдена, неверные аргументы.
Визуальность:Нет

Функция добавляет или удаляет ссылку на функцию-перехватчик визуальных событий (к примеру, вывода информации в лог или панель состояния формы). Может использоваться, к примеру, для получения и вывод на экран информации об обработках, протекающих в скрытом потоке. Крайне желательно использование конструкции Try .. Finally, чтобы гарантированно вернуть предыдущее состояние перехватчика после того, как работа будет завершена. Перехватчики могут быть установлены также и другими функциями (к примеру ExecEx).

Синтаксис

StandardOutputHook(<Тип перехватываемого события (INT)>=0,<Наименование функции, вызываемой при перехвате (STRING)>,<Глубина поиска (INT)>=0,<Параметр для передачи в функцию>):<Наименование предыдущей функции-перехватчика (STRING)>

Аргументы

  • <Тип перехватываемого события (INT)> - (необязательный аргумент) Тип события для перехвата, может принимать следующие значения:
    • 0 (по умолчанию) -- Перехват вывода в стандартный лог визуального клиента (как сообщений, созданных функциями Message, так и исключений).
    • 1 -- Перехват вывода на экран стандартных диалогов (Box, AskQuestion и т.п.).
    • 2 -- Перехват изменения статуса выполнения (Form.StatusText, Form.UpdateProgress и т.п.).
  • <Наименование функции, вызываемой при перехвате (STRING)> - (необязательный аргумент) Аргумент задает наименование особой функции, которая будет вызываться в момент (и вместо) создания перехватываемого события. Если функция не задана, перехват, для указанного первым аргументом события, будет отменен. Любые исключения внутри функции будут игнорированы. Внутри функции-перехватчика вызов функции, создающей перехватываемое событие (к примеру, вызов Message в перехватчике вывода в стандартный лог) не будет вызывать рекурсивный вызов перехватчика. В зависимости от типа перехватываемого события, функция должна иметь следующий формат:
    • Для перехвата событий с типом 0: <ФункцияПерехвата>(<Текст, выводящийся в лог (STRING)>,<Тип текста (INT)>,<Метки форматирования текста (STRING)>,<Параметр, переданный из вызова StandardOutputHook>,<Список интерактивных объектов %LINK% (LIST)>). Ниже дано описание аргументов функции:
      • <Текст, выводящийся в лог (STRING)> - (необязательный аргумент) аргумент получает текстовую строку, которая была бы выведена в лог.
      • <Тип текста (INT)> - (необязательный аргумент) аргумент получает тип текстовой строки, доступны следующие типы:
        • -1 -- эта строка является сообщением об ошибке.
        • 0 -- эта строка является обычным текстом (созданным, к примеру функциями Message или Writeln).
        • 1 -- эта строка является текстом созданным функцией Message с типом текста "i".
        • 2 -- эта строка является текстом созданным функцией Message с типом текста ".".
        • 3 -- эта строка является текстом созданным функцией Message с типом текста "!".
        • 4 -- эта строка является текстом созданным функцией Message с типом текста "!!".
        • 5 -- эта строка является текстом созданным функцией Message с типом текста "!!!".
      • <Метки форматирования текста (STRING)> - (необязательный аргумент) аргумент получает строку с метками форматирования текста. Иногда это будет пустая строка, если весь текст представляет собой строку без форматирования. В случае, когда строка задана, она отдается в виде ANSI, каждый ее символ может быть превращен в байт и будет задавать форматирование соответствующего символа в строке текста лога. Доступны следующие значения символов форматирования:
        • 0 -- Текущий символ строки лога использует стандартный цвет и шрифт (не форматирован).
        • 1 -- Текущий символ строки лога использует такой же цвет и шрифт, как и предыдущий символ.
        • 2 -- Текущий символ строки лога использует цвет и шрифт, заданные семью последующими символами строки с метками форматирования. Эти последующие символы должны быть пропущены при подсчете индекса символа строки лога (относятся только к текущему символу) и имеют следующее назначение:
          • 3 символа задают цвет шрифта (формате RGB).
          • 3 символа задают цвет фона шрифта (формате RGB).
          • 1 символ задает формат шрифта, является битовой маской с битами: 0 (жирный шрифт), 1 (наклонный шрифт), 2 (подчеркнутый шрифт), 3 (зачеркнутый шрифт).
      • <Параметр, переданный из вызова StandardOutputHook> - (необязательный аргумент) Произвольный параметр, который был получен при регистрации функции-перехватчика функцией StandardOutputHook.
      • <Список интерактивных объектов %LINK% (LIST)> - (необязательный аргумент) аргумент получает список, хранящий все интерактивные объекты, переданные функции Message. Заголовками списка служат текстовые представления этих объектов, а объектами списка -- сами объекты, закодированные функцией ObjectToString.
    • Для перехвата событий с типом 1: <ФункцияПерехвата>(<Тип диалога (INT)>,<Заголовок диалога (STRING)>,<Текст диалога (STRING)>,<Опция 1>,<Опция 2>,<Параметр, переданный из вызова StandardOutputHook>):<Результат выполнения диалога>. Ниже дано описание аргументов функции:
      • <Тип диалога (INT)> - (необязательный аргумент) аргумент получает тип перехватываемого визуального диалога. В зависимости от типа диалога аргументы "Опция 1" и "Опция 2" также могут содержать дополнительную информацию. Доступны следующие типы диалогов:
        • 0 -- Диалог, создаваемый функцией Box. Аргумент "Опция 1" содержит тип диалога Box (см. описание). Аргумент "Заголовок диалога" содержит сообщение функции Box.
        • 1 -- Диалог, создаваемый функцией AskQuestion. Аргумент "Опция 1" содержит тип диалога AskQuestion (см. описание), "опция 2" -- идентификатор кнопки по умолчанию. Аргумент "Заголовок диалога" содержит сообщение функции AskQuestion. Результат функции (Result) будет возвращен, как результат AskQuestion.
        • 2 -- Диалог, создаваемый функцией AskString. Аргумент "Опция 1" содержит тип строки AskString (см. описание), "опция 2" -- длину строки. Аргумент "Заголовок диалога" содержит заголовок функции AskString. Результат функции (Result) будет возвращен, как результат AskString.
        • 3 -- Диалог, создаваемый функцией AskNumber. Аргумент "Опция 1" содержит тип числа AskNumber в виде "<Длина числа.Знаков после точки>" (см. описание). Аргумент "Заголовок диалога" содержит заголовок функции AskNumber. Результат функции (Result) будет возвращен, как результат выполнения AskNumber.
        • 4 -- Диалог, создаваемый функцией AskDate. Аргумент "Опция 1" содержит начальную дату диалога AskDate (см. описание), "опция 2" -- режим показа диалога. Аргумент "Заголовок диалога" содержит заголовок функции AskDate. Результат функции (Result) будет возвращен, как результат выполнения AskDate.
        • 5 -- Диалог, создаваемый функцией AskPeriod. Аргумент "Текст диалога" содержит начальные даты диалога AskPeriod в виде "<Начальная дата@Конечная дата>" (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- тип периода. Аргумент "Заголовок диалога" содержит сообщение функции AskPeriod. Результат функции (Result) будет возвращен, как результат выполнения AskPeriod.
        • 10 -- Диалог, создаваемый функцией OpenFileDialog. Аргумент "Текст диалога" содержит имя файла OpenFileDialog (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- тип диалога, "опция 2" -- строку в виде "<Доступные фильтры файлов>"+Chr(1)+"<Расширение по умолчанию>". Аргумент "Заголовок диалога" содержит заголовок функции OpenFileDialog. Результат функции (Result) будет возвращен, как результат выполнения OpenFileDialog.
        • 11 -- Диалог, создаваемый функцией SaveFileDialog. Аргумент "Текст диалога" содержит имя файла SaveFileDialog (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- тип диалога, "опция 2" -- строку в виде "<Доступные фильтры файлов>"+Chr(1)+"<Расширение по умолчанию>". Аргумент "Заголовок диалога" содержит заголовок функции SaveFileDialog. Результат функции (Result) будет возвращен, как результат выполнения SaveFileDialog.
        • 12 -- Диалог, создаваемый функцией OpenFileDialogServer. Аргумент "Текст диалога" содержит имя файла OpenFileDialogServer (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- тип диалога, "опция 2" -- строку в виде "<Доступные фильтры файлов>"+Chr(1)+"<Расширение по умолчанию>". Аргумент "Заголовок диалога" содержит заголовок функции OpenFileDialogServer. Результат функции (Result) будет возвращен, как результат выполнения OpenFileDialogServer.
        • 13 -- Диалог, создаваемый функцией SaveFileDialogServer. Аргумент "Текст диалога" содержит имя файла SaveFileDialogServer (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- тип диалога, "опция 2" -- строку в виде "<Доступные фильтры файлов>"+Chr(1)+"<Расширение по умолчанию>". Аргумент "Заголовок диалога" содержит заголовок функции SaveFileDialogServer. Результат функции (Result) будет возвращен, как результат выполнения SaveFileDialogServer.
        • 14 -- Диалог, создаваемый функцией SelectFolderDialog. Аргумент "Текст диалога" содержит имя файла SelectFolderDialog (см. описание), данный аргумент также принимается назад, как результат выполнения функции. Аргумент "Заголовок диалога" содержит заголовок функции SelectFolderDialog. Результат функции (Result) будет возвращен, как результат выполнения SelectFolderDialog.
        • 20 -- Диалог, создаваемый функцией SelectDataType. Аргумент "Текст диалога" содержит список типов объектов SelectDataType (см. описание). Аргумент "Заголовок диалога" содержит заголовок функции SelectDataType. Результат функции (Result) будет возвращен, как результат выполнения SelectDataType.
        • 21 -- Диалог, создаваемый функцией SelectFormSettingsFile. Аргумент "Текст диалога" содержит путь файла установок и имя файла установок SelectFormSettingsFile в виде строки "<Пусть>\<Имя файла>" (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- тип диалога. Результат функции (Result) будет возвращен, как результат выполнения SelectFormSettingsFile.
        • 22 -- Диалог, создаваемый функцией SelectFontDialog. Аргумент "Текст диалога" содержит текст шрифта SelectFontDialog (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- настройки диалога в виде строки "<Запретить выбор стилей>"+Chr(1)+"<Минимальный размер шрифта>"+Chr(1)+"<Максимальный размер шрифта>". Результат функции (Result) будет возвращен, как результат выполнения SelectFontDialog.
        • 23 -- Диалог, создаваемый функцией SelectIconDialog. Аргумент "Текст диалога" содержит номер иконки по умолчанию SelectIconDialog (см. описание), данный аргумент также принимается назад, как результат выполнения функции. Аргумент "Заголовок диалога" содержит заголовок функции SelectIconDialog. Результат функции (Result) будет возвращен, как результат выполнения SelectIconDialog.
        • 24 -- Диалог, создаваемый функцией EditScriptDialog. Аргумент "Текст диалога" содержит исходный текст EditScriptDialog (см. описание), данный аргумент также принимается назад, как результат выполнения функции, "опция 1" -- список внешних переменных через запятую. Аргумент "Заголовок диалога" содержит заголовок функции EditScriptDialog. Результат функции (Result) будет возвращен, как результат выполнения EditScriptDialog.
      • Аргументы <Заголовок диалога>, <Текст диалога>, <Опция 1>, <Опция 2> зависят от аргумента Тип диалога (см. выше).
      • <Параметр, переданный из вызова StandardOutputHook> - (необязательный аргумент) Произвольный параметр, который был получен при регистрации функции-перехватчика функцией StandardOutputHook.
    • Для перехвата событий с типом 2: <ФункцияПерехвата>(<Тип вызова (INT)>,<Текст статуса, выполнения (STRING)>,<Текущий прогресс выполнения (INT)>,<Максимальный прогресс выполнения (INT)>,<Параметр, переданный из вызова StandardOutputHook>). Ниже дано описание аргументов функции:
      • <Тип вызова (INT)> - (необязательный аргумент) аргумент получает тип перехватываемого вызова. Доступны следующие типы:
        • 0 -- Вызывалась функция Form.StatusText. Также заполнен аргумент Текст статуса, выполнения (см. описание функции).
        • 1 -- Вызывалась функция Form.UpdateProgress. Также заполнены аргументы Текст статуса, выполнения, Текущий прогресс выполнения и Максимальный прогресс выполнения (см. описание функции).
        • 2 -- Вызывалась функция Form.StopProgress.
      • Аргументы <Текст статуса, выполнения>, <Текущий прогресс выполнения>, <Максимальный прогресс выполнения> зависят от аргумента Тип вызова (см. выше).
      • <Параметр, переданный из вызова StandardOutputHook> - (необязательный аргумент) Произвольный параметр, который был получен при регистрации функции-перехватчика функцией StandardOutputHook.
  • <Глубина поиска (INT)> - (необязательный аргумент) Может принимать следующие значения:
    • 0 (по умолчанию) -- выполнять поиск функции во всех модулях большего уровня вложенности (родительских) и во всех глобальных модулях.
    • 1 -- выполнять поиск функции только внутри текущего модуля.
    • 2 -- выполнять поиск функции только внутри родительского модуля.
    • 3..x -- выполнять поиск функции только внутри родительского модуля указанного уровня (к примеру, для уровня 3, выполнять поиск только в родителе родителя текущего модуля).
  • <Параметр для передачи в функцию> - (необязательный аргумент) Произвольный параметр, который будет передан в функцию-перехватчик при ее вызове.

Возвращаемое значение

Функция возвращает предыдущее наименование функции-перехватчика, либо пустую строку, если такой функции не было задано.

Примеры

  //Функция перехвата вывод информации и исключений в лог
  Function ВнутренняяВыполнитьОбменРабочийПотокЛоги(Текст,Тип,Цвета,спПараметры)
    Элемент:=спПараметры["Элемент"];
    If not IsEmpty(Элемент) Then
      Элемент.Caption:=Текст;
      If (Тип<0)or(Тип>2) Then
        Элемент.FontColor:=_CLR_RED;
        Элемент.FontStyle:=1;
      Else
        Элемент.FontColor:=_CLR_WINDOWTEXT;
        Элемент.FontStyle:=0;
      EndIf;
    EndIf;
  EndFunction

  //Функция перехвата изменения статуса формы
  Function ВнутренняяВыполнитьОбменРабочийПотокСтатус(Тип,Текст,Прогресс,Всего,спПараметры)
    Элемент:=спПараметры["Элемент"];
    If not IsEmpty(Элемент) Then
      Элемент.Caption:=Текст+?((Прогресс>0)And(Всего>0),", "+Прогресс+" из "+Всего+"...");
    EndIf;
  EndFunction

//Поместим текстовый элемент "Информация" для его обновления текстом перехваченных вызовов.
спПараметры:=List.Create();
спПараметры["Элемент"]:=Form.Информация;
//Перехват индикации деятельности обработки "...", которая будет выведена на весь экран в модальном режиме.
StandardOutputHook(0,"ВывестиЛоги",0,спПараметры);
StandardOutputHook(2,"ВывестиСТатус",0,спПараметры);
Try
  Try
    //Вывоз длительной обработки "..."
    LoadModule(11,"...",,0,"Module","Form");
  Except
    //Текст исключения уже на экране, его перехватил StandardOutputHook
  EndTry;
Finally
  StandardOutputHook(2);
  StandardOutputHook(0);
  If Form.Информация.FontColor<>_CLR_RED Then
    Form.Информация.Caption:="Работа окончена";
  EndIf;
EndTry;