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

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

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

timal1234

Цитата: mikekaganski от 23 ноября 2024, 01:13positions = vReturn.getHyphenationPositions()
MsgBox positions(UBound(positions))
я пытался вот так:

MsgBox vReturn.getHyphenationPositions( UBound(vReturn.getHyphenationPositions() ) )
но так ругается  ;D

mikekaganski

Цитата: timal1234 от 23 ноября 2024, 01:20я пытался вот так:

Код Выделить Развернуть
MsgBox vReturn.getHyphenationPositions( UBound(vReturn.getHyphenationPositions() ) )

И что Вы хотели этим добиться? Вы передаёте в функцию getHyphenationPositions (которая не имеет аргументов!) число; а затем хотите выдать сообщение с результатом этой функции (а она возвращает массив!).

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

timal1234

Цитата: mikekaganski от 23 ноября 2024, 01:28И что Вы хотели этим добиться?
я думал, раз это массив, то можно сразу взять последний элемент, указав его как аргумент.... по типу ARRAY(i).

ну плохо я разбираюсь в этом.... уж извиняйте...
а найти толковое описание, как применить getHyphenationPositions() - я не смог  :'(

ЦитироватьВы передаёте в функцию getHyphenationPositions (которая не имеет аргументов!)
вот этого я и не знал... я думал в скобках можно указать число (индекс массива, который возвращает функция)

Ещё раз СПАСИБО!

timal1234

сначала я пытался разбить строку на несколько ячеек, у которых ограничена ширина (допустим 11 символами).
т.е. выполнить перенос в следующие ячейки, если не помещается...
но с  vHyphen.hyphenate(STR_IN, aLocale, 11, emptyArgs()) не получилось....

и стал искать позицию для переноса.

mikekaganski

#19
Цитата: timal1234 от 23 ноября 2024, 01:39я думал, раз это массив
Массив - это результат выполнения функции. Когда Вы применяете скобки к массиву - да, Вы указываете индекс элемента. Но когда Вы их применяете к имени функции - Вы передаёте параметры (значения аргументов) функции. getHyphenationPositions - это функция. Первая пара скобок будет воспринята как её параметры. Она вернёт массив, и тогда уже к нему можно применить вторую пару.

А вот свойства не имеют аргументов. Поэтому можно

MsgBox vReturn.HyphenationPositions(UBound(vReturn.HyphenationPositions))
Бейсик воспринимает функции get*/set* как связанные с соответствующим свойством.
С уважением,
Михаил Каганский

mikekaganski

Цитата: timal1234 от 23 ноября 2024, 01:49но с 
Код Выделить Развернуть
vHyphen.hyphenate(STR_IN, aLocale, 11, emptyArgs()) не получилось...

И как всегда - непонятно, что именно не получилось. Вероятнее всего, не получилось по той же причине - что требовалось вызвать hasLocale или getLocales для инициализации.
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 23 ноября 2024, 13:40И как всегда - непонятно, что именно не получилось.
я уже даже и не помню, что именно не получилось... это было полгода назад...
а сейчас я решил кое-что подправить в своём макросе и опять уткнулся в переносы  ;D

да, скорее всего упёрся в Locale... наверное не смог победить, если строка состоит из русского и английского текста...

это теперь надо где-то в старье найти, как там у меня было

mikekaganski

Цитата: timal1234 от 23 ноября 2024, 00:24где это окно Watch ?

https://help.libreoffice.org/latest/en-US/text/sbasic/shared/01030300.html?DbPAR=BASIC

В русском интерфейсе это "Вид"->"Наблюдаемые выражения", которые по умолчанию показаны внизу (там ещё бокс "Контрольное значение", куда вводится имя интересующей переменной (плюс Enter), чтобы показать его в списке ниже).
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 23 ноября 2024, 14:04
Цитата: timal1234 от 23 ноября 2024, 00:24где это окно Watch ?

https://help.libreoffice.org/latest/en-US/text/sbasic/shared/01030300.html?DbPAR=BASIC

В русском интерфейсе это "Вид"->"Наблюдаемые выражения", которые по умолчанию показаны внизу (там ещё бокс "Контрольное значение", куда вводится имя интересующей переменной (плюс Enter), чтобы показать его в списке ниже).
Спасибо!
Буду иметь ввиду...
но если честно, я не программист и никогда этим не пользовался  ;D
попробую разобраться, как этим пользоваться.

timal1234

#24
Sub TEST
Dim STR_IN 'слово для проверки
STR_IN = "Переносимое 123"

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
' в качестве альтернативы можно просто vHyphen.getLocales()
vReturn = vHyphen.createPossibleHyphens( LTrim(RTrim(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, "Расстановка переносов слов"

MsgBox ("Массив найденных позиций для переноса: " + CHR(13) + Join( vReturn.getHyphenationPositions(), "; ") )
End Sub
очень странно, что эта функция предлагает оставить одну букву на следующей строке....
это же не по правилам русского языка.  :roll:   ???

Например строка "Переносимое 123"
 

mikekaganski

1. Попробуйте "Переносимое" вместо "Переносимое 123".
2. Откройте документацию по функции createPossibleHyphens, и проанализируйте, что значит "aWord - is the word for which information about the possible hyphenation positions is to be retrieved".

Неважно, "программист" Вы или нет. Вы пишете программу - значит, надо читать документацию. Причём на английском. Или так, или это должен делать кто-то другой.
С уважением,
Михаил Каганский

timal1234

да, я не программист, и да, я изучал в школе только Basic ...
а com::sun:: и uno для меня тёмный лес...
и ещё я изучал немецкий....
поэтому документация на английском создаёт немало трудностей для меня.
хорошо, что есть онлайн-переводчики
 ;D  ;D  ;D
Цитата: mikekaganski от 23 ноября 2024, 16:24проанализируйте, что значит "aWord - is the word for which information about the possible hyphenation positions is to be retrieved".
совсем не обратил на это внимание  :roll:
понял...
спасибо!

 

timal1234

наверное опять дурацкий вопрос:
а как получить язык переносимого слова и передать его createPossibleHyphens ?


mikekaganski

#28
oLocale = ThisComponent.CurrentController.ViewCursor.CharLocale
Хотя прошу прощения, это же Calc. Сейчас поищу.

ThisComponent.Sheets(0).getCellByPosition(0,0).CharLocale
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 23 ноября 2024, 17:08ThisComponent.Sheets(0).getCellByPosition(0,0).CharLocale
а если это не ячейка, а строка из массива ?