Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

7 Декабрь 2021, 18:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Какой объект в точности передается при возникновении события листа OnChange?  (Прочитано 411 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Стартовое сообщение: 16 Ноябрь 2021, 10:51 »

На событие листа '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  Формулы вычислены


* Снимок экрана от 2021-11-16 10-54-02.png (125.59 Кб, 888x688 - просмотрено 5 раз.)
« Последнее редактирование: 16 Ноябрь 2021, 11:27 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 396


« Ответ #1: 16 Ноябрь 2021, 12:02 »

В точности в отдельном конкретном случае передаётся именно объект, указанный на Вашем скриншоте: 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
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #2: 16 Ноябрь 2021, 12:19 »

Михаил, спасибо за исчерпывающий ответ.
Так и пометил у себя:
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
Пользователь работает с диапазоном критериев фильтра, и может вводить данные в ячейки, как угодно, это неважно (одна ячейка, связный или нет диапазон).
« Последнее редактирование: 16 Ноябрь 2021, 16:40 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 396


« Ответ #3: 16 Ноябрь 2021, 18:03 »

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

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

С уважением,
Михаил Каганский
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 625


WWW
« Ответ #4: 17 Ноябрь 2021, 16:29 »

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

Владимир.
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!