OnAfterEdit

From SunFlurry wiki
Revision as of 21:41, 2 March 2019 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  OnAfterEdit (События таблиц)
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Расположение:Любой глобальный модуль, текущий локальный модуль
Визуальность:Да

Функция вызывается для свободных или встроенных электронных таблиц (TABLE) после окончания редактирования ячейки или объекта таблицы. Для встроенных таблиц будет вызван одноименный обработчик события, если задан, иначе данная функция. Функция вызывается для таблиц в режиме ограниченного редактирования (интерактивном режиме) и только для ячеек (или объектов), для которых не установлена галка "защита редактирования", таким образом отсекаются не подлежающие редактированию ячейки (объекты). Функция не будет вызвана для таблиц, которые находятся в режиме обычного редактирования (изменения свойств ячеек, текста, цветов и пр.), и для таблиц находящихся в режиме просмотра (особый режим с запретом сохранения таблиц на диск). Редактирование обычно инициируется пользователем, используя двойной клик мыши по ячейке или объекту или при нажатии клавиши Enter, после чего, если отредактировав содержимое ячейки или объекта, пользователь пытается сохранить произведенные изменения (с помощью клавиши Enter, либо выделения любой другой ячейки таблицы), будет вызвана данная функция. Функция не будет вызвана для редактируемой ячейки, если пользователь откажется от сохранения изменений с помощью клавиши ESC.

Важно: В текущей реализации, само редактируемое значение не передается в тело функции с помощью параметра, оно будет записано в поле значение (Value) редактируемой ячейки или объекта. Такой подход имеет как свои плюсы (возможность получить контекстный вызов объекта сразу после редактирования без дополнительных действий в программе), также и свои минусы. К примеру, возможно, в значении ячейки хранился список с параметрами, указывающими на предназначение ячейки, однако, после редактирования, этот список будет удален и вместо него сохранено редактируемое значение. Для того, чтобы избежать потери старого значения, необходимо еще при вызове функции OnBeforeEdit сохранить его во внешней переменной и вернуть в ячейку в теле функции OnAfterEdit, см. пример ниже.

Для дополнительной информации см. статьи OnBeforeEdit, Электронная таблица SFT и Редактор электронных таблиц.

Синтаксис

OnAfterEdit(<Вызывающая таблица (TABLE)>,<Режим редактирования (INT)>,<Тип объекта (INT)>,<Индекс объекта (INT)>,<Строка (INT)>,<Столбец (INT)>,<Были изменения (INT)>)

Аргументы

  • <Вызывающая таблица (TABLE)> - Таблица, для которой произведена попытка сохранения изменений, произведенных пи редактировании ячсейки (объекта).
  • <Режим редактирования (INT)> - Передает режим, в котором происходило режактирование (см. OnBeforeEdit). 0 -- встроенный (текстовый) редактор SFT, 1 -- редактор с возможностями поля редактирования
  • <Тип объекта (INT)> - -1, если редактировалась ячейка, иначе цифровой тип объекта, для которого производился процесс редактирования. Текущие типы объектов:
    • -1 -- ячейка таблицы
    • 0 -- линия (редактирование для данного объекта не осуществляется)
    • 1 -- прямоугольник
    • 2 -- картинка
    • 3 -- OLE-объект
    • 4 -- диаграмма
  • <Индекс объекта (INT)> - Индекс объекта таблицы, для которого происходило редактирование, если редактировалась ячейка, данный параметр принимает значение -1.
  • <Строка (INT)> - Строка таблицы ячейки редактирования, если редактировался объект, данный параметр принимает значение -1.
  • <Столбец (INT)> - Столбец таблицы ячейки редактирования, если редактировался объект, данный параметр принимает значение -1.
  • <Были изменения (INT)> - 0 -- если пользователь не менял поле редактирования, 1 -- если изменения производились.

Примеры

//Переменная для временного хранения значения ячейки редактирования
Var спРедактируемоеЗначение Export;

Function OnBeforeEdit(SourceTable,EditMode,ObjectType,ObjectIndex,Line,Column,AttButtons,EditValue,EditMask)
  //Запретить редактировать по умолчанию
  EditMode:=2;
  If ObjectType<>-1 Then
    //Редактирование не производится для объектов
    Exit;
  EndIf;
  //Получить значение ячейки таблицы (в отличие от ее видимого текста, значение может содержать произвольный объект и не видно пользователю)
  aList:=SourceTable.Area(Column,Line,Column,Line).Value;
  if typeStr(aList)<>"LIST" Then
    //Если значение не является списком, не разрешать редактирование
    Exit;
  EndIf;
  if isEmpty(aList.GetByName("Индекс")) Then
    //Если в списке отсутствует элемент с именем "Индекс", не разрешать редактирование
    Exit;
  EndIf;
  //Сохранить значение ячейки, так как оно будет утеряно после редактирования
  спРедактируемоеЗначение:=aList;
  //Получить текст ячейки редактирования и превратить его в число
  EditValue:=Number(Replace(Replace(SourceTable.Area(Column,Line,Column,Line).Text,"'","")," ",""));
  //Производится редактирование в режиме расширенного редактора
  EditMode:=1;
  //При рекдатировани использовать редактор числа с двумя знаками после десятичной точки
  EditMask:="!10.2";
  //Добавить связанный элемент (кнопку) с иконкой калькулятора, которая автоматически будет вызывать калькулятор для помощи в редактировании числового поля
  AttButtons:=""+_AB_CALC;
EndFunction

Function OnAfterEdit(SourceTable,EditMode,ObjectType,ObjectIndex,Line,Column,isChanged)
  //Получить текущее значение ячейки
  аЧисло:=Number(Т.Area(Column,Line,Column,Line).Value);
  //Вернем значение, которое было в ячейке до начала редактирования
  SourceTable.Area(Column,Line,Column,Line).Value:=спРедактируемоеЗначение;
  //Отобразим редактируемое значение для пользователя в виде текста
  SourceTable.Area(Column,Line,Column,Line).Text:=FormatNumber(aNum,1," ",2);

  //Изменим данные на основании введенного пользователем числа (аЧисло) и значения ячейки (спРедактируемоеЗначение), которое указывает на то, какие данные подлежат изменению.
  ...

EndFunction