Какой объект в точности передается при возникновении события листа OnChange?

Автор eeigor, 16 ноября 2021, 10:51

0 Пользователи и 1 гость просматривают эту тему.

eeigor

На событие листа 'Content Changed' подвешена процедура

Sub Sheet_OnChange(oTarget As Object)
   Xray oTarget
End Sub

Хочу в учебных целях понять и явно определить тип объекта oTarget. В действительности это будет ссылка на ячейку (ScCellObj) или на диапазон ячеек (ScCellRangeObj).
Что это?
1) oTarget As com.sun.star.sheet.XSheetCellRange
2) oTarget As com.sun.star.sheet.SheetCellRange
3) oTarget As com.sun.star.table.CellRange

Работает, как ни странно, со всеми приведёнными объектами без ошибок. Xray внятного ответа не даёт.

В других случаях, как правило, в событийную процедуру передаётся объект Event (который имеет свойство Source), например:
Sub Document_OnLoad(oEvent As com.sun.star.document.DocumentEvent)
Sub cmdHelp_actionPerformed(oEvent As com.sun.star.awt.ActionEvent)


UPDATED:
Перечень всех событий листа (7):

OnFocus  Activate Document  Активизация документа
OnUnfocus  Deactivate Document  Деактивизация документа
OnSelect  Selection changed  Выделенная область изменена
OnDoubleClick  Double click  Двойной щелчок
OnRightClick  Right click  Щелчок правой кнопкой
OnChange  Content changed  Содержимое изменено
OnCalculate  Formulas calculated  Формулы вычислены
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

В точности в отдельном конкретном случае передаётся именно объект, указанный на Вашем скриншоте: ScCellRangeObj. Это реализация кучи интерфейсов UNO: com.sun.star.beans.XPropertySet, com.sun.star.beans.XMultiPropertySet, com.sun.star.beans.XPropertyState, com.sun.star.sheet.XSheetOperation, com.sun.star.chart.XChartDataArray, com.sun.star.util.XIndent, com.sun.star.sheet.XCellRangesQuery, com.sun.star.sheet.XFormulaQuery, com.sun.star.util.XReplaceable, com.sun.star.util.XModifyBroadcaster, com.sun.star.lang.XServiceInfo, com.sun.star.lang.XUnoTunnel, com.sun.star.beans.XTolerantMultiPropertySet, com.sun.star.sheet.XCellRangeAddressable, com.sun.star.sheet.XSheetCellRange, com.sun.star.sheet.XArrayFormulaRange, com.sun.star.sheet.XArrayFormulaTokens, com.sun.star.sheet.XCellRangeData, com.sun.star.sheet.XCellRangeFormula, com.sun.star.sheet.XMultipleOperation, com.sun.star.util.XMergeable, com.sun.star.sheet.XCellSeries, com.sun.star.table.XAutoFormattable, com.sun.star.util.XSortable, com.sun.star.sheet.XSheetFilterableEx, com.sun.star.sheet.XSubTotalCalculatable, com.sun.star.util.XImportable, com.sun.star.sheet.XCellFormatRangesSupplier, com.sun.star.sheet.XUniqueCellFormatRangesSupplier, com.sun.star.table.XColumnRowRange. Соовтетственно, он реализует и несколько сервисов: com.sun.star.sheet.SheetCellRange, com.sun.star.table.CellRange, com.sun.star.table.CellProperties, com.sun.star.style.CharacterProperties, com.sun.star.style.ParagraphProperties. Ни один из интерфейсов не является точным типом передаваемого объекта (в т.ч. в Basic), но этот объект является всеми ими одновременно.

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

Вероятно, вопрос в том, какой интерфейс используется внутри при вызове события? Это просто com.sun.star.uno.XInterface: см. код ScModelObj::NotifyChanges. Здесь видно, что на сегодняшний день в данном конкретном месте кода в зависимости от ситуации в обработчик могут быть переданы объекты трёх внутренних типов: ScCellObj, ScCellRangeObj или ScCellRangesObj.
С уважением,
Михаил Каганский

eeigor

Михаил, спасибо за исчерпывающий ответ.
Так и пометил у себя:
Sub Sheet_OnChange(oTarget As Object)  'ScCellObj, ScCellRangeObj, ScCellRangesObj

UPDATED:
После того, как разобрались здесь с объектом oTarget, я удалил из текста процедуры следующий код за ненадобностью:
   If Not oTarget.supportsService("com.sun.star.sheet.SheetCellRange") Then
      Exit Sub
   End If
Пользователь работает с диапазоном критериев фильтра, и может вводить данные в ячейки, как угодно, это неважно (одна ячейка, связный или нет диапазон).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: eeigor от 16 ноября 2021, 12:19
UPDATED:
После того, как разобрались здесь с объектом oTarget, я удалил из текста процедуры следующий код за ненадобностью:
   If Not oTarget.supportsService("com.sun.star.sheet.SheetCellRange") Then
      Exit Sub
   End If
Пользователь работает с диапазоном критериев фильтра, и может вводить данные в ячейки, как угодно, это неважно (одна ячейка, связный или нет диапазон).

Если проверка была для того, чтобы в дальнейшем использовать методы интерфейсов сервиса, то проверка не была ненужной: ScCellRangesObj не реализует этот сервис. Но не видя код, можно только гадать; если действительно удалось почистить ненужный код, это здорово.
С уважением,
Михаил Каганский

sokol92

Михаил, спасибо за подробные разъяснения! Возможность посмотреть исходный текст (если есть возможность использовать эту возможность  ;D) - великая сила.
Владимир.