Как узнать размер ячейки текстовой таблицы

Автор proger1983, 21 июня 2022, 17:11

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

proger1983

Здравствуйте, форумчане. Имеется таблица в Writer'е (SwXTextTable). Как определить размеры каждой ее ячейки (SwXCell), учитывая, что таблица может содержать разбиение/объединение ячеек?

sokol92

#1
Добрый день! Не думаю, что это просто.
Какова цель такого измерения? Связано с работой с окном?

Зная имя текстовой таблицы и имя ячейки таблицы, можно через интерфейсы AccessibleContext найти окно, соответствующее ячейке и его размеры.
Владимир.

proger1983

Цитата: sokol92 от 21 июня 2022, 18:40
Добрый день! Не думаю, что это просто.
Какова цель такого измерения? Связано с работой с окном?

Зная имя текстовой таблицы и имя ячейки таблицы, можно через интерфейсы AccessibleContext найти окно, соответствующее ячейке и его размеры.

Нет, нужно изображение вставить под размер ячейки.

sokol92

#3
Можно установить изображение как фон ячейки текстовой таблицы.
При этом свойство ячейки BackGraphicLocation должно быть установлено как com.sun.star.style.GraphicLocation.AREA.

Спасибо Михаилу Каганскому за консультации.

Пример.

' Устанавивает фоновое изображение ячейки "C2" первой таблицы документа и масштабирует изображение по размеру ячейки.
' Переменная url задает путь к изображению.
Sub InsertBackGraphic
  Dim oCell, oProvider, url As String
  Dim oProps(0) as new com.sun.star.beans.PropertyValue 
 
  url="https://forumooo.ru/Themes/default/images/seageals/sggm.png"
 
  oProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
  oProps(0).Name  = "URL"
  oProps(0).Value = url

  oCell=ThisComponent.TextTables(0).getCellByName("C2") 
  With oCell
    .BackGraphic=oProvider.queryGraphic(oProps())
    .BackGraphicLocation=com.sun.star.style.GraphicLocation.AREA
  End With

End Sub
Владимир.

proger1983

Цитата: sokol92 от 22 июня 2022, 14:31
Можно установить изображение как фон ячейки текстовой таблицы.
При этом свойство ячейки BackGraphicLocation должно быть установлено как com.sun.star.style.GraphicLocation.AREA.

Спасибо Михаилу Каганскому за консультации.

Пример.

' Устанавивает фоновое изображение ячейки "C2" первой таблицы документа и масштабирует изображение по размеру ячейки.
' Переменная url задает путь к изображению.
Sub InsertBackGraphic
  Dim oCell, oProvider, url As String
  Dim oProps(0) as new com.sun.star.beans.PropertyValue 
 
  url="https://forumooo.ru/Themes/default/images/seageals/sggm.png"
 
  oProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
  oProps(0).Name  = "URL"
  oProps(0).Value = url

  oCell=ThisComponent.TextTables(0).getCellByName("C2") 
  With oCell
    .BackGraphic=oProvider.queryGraphic(oProps())
    .BackGraphicLocation=com.sun.star.style.GraphicLocation.AREA
  End With

End Sub


А можно ли потом у фона узнать получившийся размер? Изображение должно генерироваться под размер, а не растягиваться/сжиматься под существующую ячейку. И таких изображений может быть несколько в ячейке, главное в ширину столбца влезать.

sokol92

#5
Для определения ширины ячейки (возможно, объединенной) текстовой таблицы можно применить следующую последовательность действий.

1. Определить относительную ширину ячейки. Для этого нужно проанализировать свойство TableColumnSeparators строки текстовой таблицы, к которой относится ячейка (массив разделителей учитывает возможное обьединение ячеек).  Полученное значение относительной ширины, к примеру, 3000 будет означает, что ширина ячейки составляет 30% от ширины всей таблицы (TableColumnRelativeSum).

2. Определить ширину всей таблицы. По этому поводу см. раздел "8.9. How wide is a text table?" книги А.Питоньяка AndrewMacro.odt

3. Определить абсолютную ширину ячейки на основе п.1-2. При определении "полезной" ширины ячейки необходимо еще дополнительно учесть поля слева и справа.

Большое спасибо Михаилу Каганскому за консультации!  :)


P.S. Не уверен, что в ответе на форуме нужно цитировать полностью предыдущее сообщение. Это, возможно, повышает мой индекс цитирования, но вряд ли способствует комфортному просмотру темы...  :)
Владимир.