макрос Calc - как получить позицию переноса

Автор timal1234, 22 ноября 2024, 23:32

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

timal1234

Всем привет!

нужно получить позицию последнего возможного переноса в слове.
 
увидеть возможные переносы через .getPossibleHyphens() я смог...

никак не могу понять, как получить позицию переноса через getHyphenationPositions().
это свойство никак не удаётся применить - выдаёт ошибку.

начало кода такое:
Sub TEST
Dim STR_IN 'слово для проверки
Dim vReturn      'Значение возвращаемое для SpellChecker, Hyphenator и Thesaurus
Dim msg$         'Строка сообщения
Dim emptyArgs() as new com.sun.star.beans.PropertyValue
Dim aLocale As New com.sun.star.lang.Locale
Dim vHyphen As Variant
STR_IN = "Переносимое"
vHyphen = createUnoService("com.sun.star.linguistic2.Hyphenator")
aLocale.Language = "ru" 'Использовать Русский язык
aLocale.Country = "RU" 'Использовать Россию как страну
vReturn = vHyphen.createPossibleHyphens(STR_IN, aLocale, emptyArgs())

msg = "aLocale.Language = " & aLocale.Language & CHR(13) _
& "aLocale.Country = " & aLocale.Country & CHR(13) _
& "------------------" & CHR(13) & CHR(13) _
& "перенос для:" & CHR(13) _
& STR_IN & CHR(13) _
& "------------------" & CHR(13) & CHR(13) _
& vReturn.getPossibleHyphens()
MsgBox msg, 0, "Расстановка переносов слов"
End Sub

 

mikekaganski

Цитата: timal1234 от 22 ноября 2024, 23:32никак не могу понять, как получить позицию переноса через
Код Выделить Развернуть
getHyphenationPositions().
это свойство никак не удаётся применить - выдаёт ошибку.

начало кода такое:

... и дальше код совсем без вызовов getHyphenationPositions?
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 22 ноября 2024, 23:41и дальше код совсем без вызовов getHyphenationPositions?
да я не могу понять, как его использовать.

хотел присвоить переменной позицию последнего переноса и вывести в MsgBox .
но пишет ошибку

mikekaganski

А почему Вы считаете, что Вам надо его использовать? В чём проблема? Вы пробовали вызвать её? Что произошло?

Потому что так не бывает: вот код, я думаю, что мне нужна функция, но я даже не пробовал ничего, только размышлял и ничего не размыслил.

Цитата: timal1234 от 22 ноября 2024, 23:51хотел присвоить переменной позицию последнего переноса и вывести в MsgBox .
но пишет ошибку

И какую ошибку пишет? В каком месте? Все магические шары на ремонте, чтение мыслей не работает.
С уважением,
Михаил Каганский

timal1234

#4
Цитата: mikekaganski от 22 ноября 2024, 23:54Вы пробовали вызвать её? Что произошло?
пробовал
уже даже и не помню, какие были варианты...

например так:
MsgBox( vReturn.getHyphenationPositions() )или
Pos_Perenos = CStr(vReturn.getHyphenationPositions() )
MsgBox(Pos_Perenos)
 

вроде ещё пробовал так:
Pos_Perenos = CStr(vReturn.getHyphenationPositions(1) ) 

timal1234

#5
Цитата: mikekaganski от 22 ноября 2024, 23:54И какую ошибку пишет?
объектная переменная не установлена
на MsgBox( vReturn.getHyphenationPositions() ) ругается

mikekaganski

Цитата: timal1234 от 22 ноября 2024, 23:59объектная переменная не установлена
И Вы проверяли состояние переменных?
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 22 ноября 2024, 23:54А почему Вы считаете, что Вам надо его использовать?
мне нужно обрезать строку, чтобы перенести остаток от переноса в следующую ячейку. поэтому пытаюсь получить позицию переноса.

timal1234

Цитата: mikekaganski от 23 ноября 2024, 00:01И Вы проверяли состояние переменных?
вроде да... ;D
IF VarType(Pos_Perenos) = vbEmpty THEN .... отправляем на поиск переноса

mikekaganski

Если Вы проверяли состояние переменных, тогда что Вы выяснили, какая конкретно переменная не установлена?

Просто я вижу, что Вы, похоже, даже не посмотрели в окне Watch на то, что у Вас не установлена переменная vReturn после вызова createPossibleHyphens. Естественно, пытаться получить её свойства потом не выйдет - но это не проблема "как мне использовать эту функцию", а проблема "почему не происходит разбивка". Как Вы программируете, если Вы не знаете состояние переменных после каждого шага?

В общем, вызовите

vHyphen.getLocales()
сразу после создания vHyphen.

А то, что этот вызов не происходит автоматически - это баг.
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 23 ноября 2024, 00:10
ЦитироватьПросто я вижу, что Вы, похоже, даже не посмотрели в окне Watch
не ругайтесь, но где это окно Watch ?

ЦитироватьВ общем, вызовите
vHyphen.getLocales()
сразу после создания vHyphen.
Если так:
MsgBox( vHyphen.getHyphenationPositions() )то пишет свойство или метод не найдены getHyphenationPositions
а если так:
MsgBox( vReturn.getHyphenationPositions() )то ошибка та же
объектная переменная не установлена

mikekaganski

Sub TEST23
Dim vReturn      'Значение возвращаемое для SpellChecker, Hyphenator и Thesaurus
Dim msg$         'Строка сообщения
Dim emptyArgs() as new com.sun.star.beans.PropertyValue
Dim aLocale As New com.sun.star.lang.Locale
Dim vHyphen As Variant
vHyphen = createUnoService("com.sun.star.linguistic2.Hyphenator")
vHyphen.getLocales()
aLocale.Language = "ru" 'Использовать Русский язык
aLocale.Country = "RU" 'Использовать Россию как страну
if not vHyphen.hasLocale(aLocale) then exit sub ' <= here the locales are loaded
' can alternatively just call vHyphen.getLocales()
vReturn = vHyphen.createPossibleHyphens("Переносимое", aLocale, emptyArgs())

        msg = "aLocale.Language = " & aLocale.Language & CHR(13) _
                    & "aLocale.Country = " & aLocale.Country & CHR(13) _
                    & "------------------" & CHR(13) & CHR(13) _
                    & "перенос для:" & CHR(13) _
                    & STR_IN & CHR(13) _
                    & "------------------" & CHR(13) & CHR(13) _
                    & vReturn.getPossibleHyphens()
MsgBox msg, 0, "Расстановка переносов слов"
for each pos in vReturn.getHyphenationPositions()
  MsgBox pos
next pos
End Sub
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 23 ноября 2024, 00:36for each pos in vReturn.getHyphenationPositions()
  MsgBox pos
next pos
Спасибо!
а почему последнее значение показывает ноль ?
не бейте сильно, но:
а сразу последний перенос нельзя узнать? обязательно перебором ?

mikekaganski

Цитата: timal1234 от 23 ноября 2024, 00:47а почему последнее значение показывает ноль ?

Баг.

Цитата: timal1234 от 23 ноября 2024, 00:47а сразу последний перенос нельзя узнать? обязательно перебором ?

Когда Вы сообщите предыдущий баг в баг-трекер, и мы его починим, то элементарно:

positions = vReturn.getHyphenationPositions()
MsgBox positions(UBound(positions))
С уважением,
Михаил Каганский

timal1234

в общем, вроде всё получилось, последнюю позицию переноса я получил.

СПАСИБО ОГРОМНОЕ!