Всем привет!
нужно получить позицию последнего возможного переноса в слове.
увидеть возможные переносы через .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
Цитата: timal1234 от 22 ноября 2024, 23:32никак не могу понять, как получить позицию переноса через
Код Выделить Развернуть
getHyphenationPositions()
.
это свойство никак не удаётся применить - выдаёт ошибку.
начало кода такое:
... и дальше код совсем без вызовов getHyphenationPositions?
Цитата: mikekaganski от 22 ноября 2024, 23:41и дальше код совсем без вызовов getHyphenationPositions?
да я не могу понять, как его использовать.
хотел присвоить переменной позицию последнего переноса и вывести в MsgBox .
но пишет ошибку
А почему Вы считаете, что Вам надо его использовать? В чём проблема? Вы пробовали вызвать её? Что произошло?
Потому что так не бывает: вот код, я думаю, что мне нужна функция, но я даже не пробовал ничего, только размышлял и ничего не размыслил.
Цитата: timal1234 от 22 ноября 2024, 23:51хотел присвоить переменной позицию последнего переноса и вывести в MsgBox .
но пишет ошибку
И какую ошибку пишет? В каком месте? Все магические шары на ремонте, чтение мыслей не работает.
Цитата: mikekaganski от 22 ноября 2024, 23:54Вы пробовали вызвать её? Что произошло?
пробовал
уже даже и не помню, какие были варианты...
например так:
MsgBox( vReturn.getHyphenationPositions() )
или
Pos_Perenos = CStr(vReturn.getHyphenationPositions() )
MsgBox(Pos_Perenos)
вроде ещё пробовал так:
Pos_Perenos = CStr(vReturn.getHyphenationPositions(1) )
Цитата: mikekaganski от 22 ноября 2024, 23:54И какую ошибку пишет?
объектная переменная не установлена
на MsgBox( vReturn.getHyphenationPositions() ) ругается
Цитата: timal1234 от 22 ноября 2024, 23:59объектная переменная не установлена
И Вы проверяли состояние переменных?
Цитата: mikekaganski от 22 ноября 2024, 23:54А почему Вы считаете, что Вам надо его использовать?
мне нужно обрезать строку, чтобы перенести остаток от переноса в следующую ячейку. поэтому пытаюсь получить позицию переноса.
Цитата: mikekaganski от 23 ноября 2024, 00:01И Вы проверяли состояние переменных?
вроде да... ;D
IF VarType(Pos_Perenos) = vbEmpty THEN .... отправляем на поиск переноса
Если Вы проверяли состояние переменных, тогда что Вы выяснили, какая конкретно переменная не установлена?
Просто я вижу, что Вы, похоже, даже не посмотрели в окне Watch на то, что у Вас не установлена переменная vReturn после вызова createPossibleHyphens. Естественно, пытаться получить её свойства потом не выйдет - но это не проблема "как мне использовать эту функцию", а проблема "почему не происходит разбивка". Как Вы программируете, если Вы не знаете состояние переменных после каждого шага?
В общем, вызовите
vHyphen.getLocales()
сразу после создания vHyphen.
А то, что этот вызов не происходит автоматически - это баг.
Цитата: mikekaganski от 23 ноября 2024, 00:10ЦитироватьПросто я вижу, что Вы, похоже, даже не посмотрели в окне Watch
не ругайтесь, но где это окно Watch ?
ЦитироватьВ общем, вызовите
vHyphen.getLocales()
сразу после создания vHyphen.
Если так:
MsgBox( vHyphen.getHyphenationPositions() )
то пишет свойство или метод не найдены getHyphenationPositions
а если так:
MsgBox( vReturn.getHyphenationPositions() )
то ошибка та же
объектная переменная не установлена
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
Цитата: mikekaganski от 23 ноября 2024, 00:36for each pos in vReturn.getHyphenationPositions()
MsgBox pos
next pos
Спасибо!
а почему последнее значение показывает ноль ?
не бейте сильно, но:
а сразу последний перенос нельзя узнать? обязательно перебором ?
Цитата: timal1234 от 23 ноября 2024, 00:47а почему последнее значение показывает ноль ?
Баг.
Цитата: timal1234 от 23 ноября 2024, 00:47а сразу последний перенос нельзя узнать? обязательно перебором ?
Когда Вы сообщите предыдущий баг в баг-трекер, и мы его починим, то элементарно:
positions = vReturn.getHyphenationPositions()
MsgBox positions(UBound(positions))
в общем, вроде всё получилось, последнюю позицию переноса я получил.
СПАСИБО ОГРОМНОЕ!
Цитата: mikekaganski от 23 ноября 2024, 01:13positions = vReturn.getHyphenationPositions()
MsgBox positions(UBound(positions))
я пытался вот так:
MsgBox vReturn.getHyphenationPositions( UBound(vReturn.getHyphenationPositions() ) )
но так ругается ;D
Цитата: timal1234 от 23 ноября 2024, 01:20я пытался вот так:
Код Выделить Развернуть
MsgBox vReturn.getHyphenationPositions( UBound(vReturn.getHyphenationPositions() ) )
И что Вы хотели этим добиться? Вы передаёте в функцию getHyphenationPositions (которая не имеет аргументов!) число; а затем хотите выдать сообщение с результатом этой функции (а она возвращает массив!).
MsgBox vReturn.getHyphenationPositions()(UBound(vReturn.getHyphenationPositions()))
Цитата: mikekaganski от 23 ноября 2024, 01:28И что Вы хотели этим добиться?
я думал, раз это массив, то можно сразу взять последний элемент, указав его как аргумент.... по типу ARRAY(i).
ну плохо я разбираюсь в этом.... уж извиняйте...
а найти толковое описание, как применить getHyphenationPositions() - я не смог :'(
ЦитироватьВы передаёте в функцию getHyphenationPositions (которая не имеет аргументов!)
вот этого я и не знал... я думал в скобках можно указать число (индекс массива, который возвращает функция)
Ещё раз СПАСИБО!
сначала я пытался разбить строку на несколько ячеек, у которых ограничена ширина (допустим 11 символами).
т.е. выполнить перенос в следующие ячейки, если не помещается...
но с vHyphen.hyphenate(STR_IN, aLocale, 11, emptyArgs())
не получилось....
и стал искать позицию для переноса.
Цитата: timal1234 от 23 ноября 2024, 01:39я думал, раз это массив
Массив - это результат выполнения функции. Когда Вы применяете скобки к массиву - да, Вы указываете индекс элемента. Но когда Вы их применяете к имени функции - Вы передаёте параметры (значения аргументов) функции.
getHyphenationPositions - это функция. Первая пара скобок будет воспринята как её параметры. Она вернёт массив, и тогда уже к нему можно применить вторую пару.
А вот
свойства не имеют аргументов. Поэтому можно
MsgBox vReturn.HyphenationPositions(UBound(vReturn.HyphenationPositions))
Бейсик воспринимает функции get*/set* как связанные с соответствующим свойством.
Цитата: timal1234 от 23 ноября 2024, 01:49но с
Код Выделить Развернуть
vHyphen.hyphenate(STR_IN, aLocale, 11, emptyArgs())
не получилось...
И как всегда - непонятно, что именно не получилось. Вероятнее всего, не получилось по той же причине - что требовалось вызвать hasLocale или getLocales для инициализации.
Цитата: mikekaganski от 23 ноября 2024, 13:40И как всегда - непонятно, что именно не получилось.
я уже даже и не помню, что именно не получилось... это было полгода назад...
а сейчас я решил кое-что подправить в своём макросе и опять уткнулся в переносы ;D
да, скорее всего упёрся в Locale... наверное не смог победить, если строка состоит из русского и английского текста...
это теперь надо где-то в старье найти, как там у меня было
Цитата: timal1234 от 23 ноября 2024, 00:24где это окно Watch ?
https://help.libreoffice.org/latest/en-US/text/sbasic/shared/01030300.html?DbPAR=BASIC
В русском интерфейсе это "Вид"->"Наблюдаемые выражения", которые по умолчанию показаны внизу (там ещё бокс "Контрольное значение", куда вводится имя интересующей переменной (плюс Enter), чтобы показать его в списке ниже).
Цитата: 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
попробую разобраться, как этим пользоваться.
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"
1. Попробуйте "Переносимое" вместо "Переносимое 123".
2. Откройте документацию по функции createPossibleHyphens (https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1linguistic2_1_1XHyphenator.html#a93736b1fb58afc4e50951ee25ebfb2ca), и проанализируйте, что значит "aWord - is the word for which information about the possible hyphenation positions is to be retrieved".
Неважно, "программист" Вы или нет. Вы пишете программу - значит, надо читать документацию. Причём на английском. Или так, или это должен делать кто-то другой.
да, я не программист, и да, я изучал в школе только 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:
понял...
спасибо!
наверное опять дурацкий вопрос:
а как получить язык переносимого слова и передать его createPossibleHyphens ?
oLocale = ThisComponent.CurrentController.ViewCursor.CharLocale
Хотя прошу прощения, это же Calc. Сейчас поищу.
ThisComponent.Sheets(0).getCellByPosition(0,0).CharLocale
Цитата: mikekaganski от 23 ноября 2024, 17:08ThisComponent.Sheets(0).getCellByPosition(0,0).CharLocale
а если это не ячейка, а строка из массива ?
В смысле? Вы хотите угадать язык просто строки? Это Вам к искусственному интеллекту, LibreOffice такого не умеет.
Цитата: mikekaganski от 23 ноября 2024, 17:23Вы хотите угадать язык просто строки?
ну да (язык слова).
есть слово, надо сделать перенос... слово может быть RU или ENG ....
неужели невозможно узнать язык слова?
или только анализировать код ASCII ?
Цитата: mikekaganski от 23 ноября 2024, 17:23LibreOffice такого не умеет.
как же так? язык ячейки умеет получить, а язык строковой переменной - нет ?
Если только en/ru, то тогда это просто - именно по кодам (Unicode). Меньше 128 - английский.
Цитата: timal1234 от 23 ноября 2024, 17:31как же язык ячейки умеет получить, а язык строковой переменной - нет ?
Возможно, потому что у ячейки есть такое свойство? Причём это свойство никак не мешает пользователю выставить язык русский, а написать по-английски.
Цитата: mikekaganski от 23 ноября 2024, 17:31Если только en/ru, то тогда это просто - именно по кодам (Unicode). Меньше 128 - английский.
вот по-моему на этом я и завалился, когда пытался сделать перенос через
vHyphen.hyphenate(STR_IN, aLocale, 11, emptyArgs())
Цитата: mikekaganski от 23 ноября 2024, 17:23Это Вам к искусственному интеллекту, LibreOffice такого не умеет.
@timal, попробуйте поиграться с сервисом LanguageGuessing (https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1linguistic2_1_1LanguageGuessing.html). Расскажите о результатах.
@sokol92, это конечно интересно, но плохому учить (https://bugs.documentfoundation.org/show_bug.cgi?id=139185#c4) не нужно! ;)
Вот примитивная функция, определяющая язык по одной первой букве:
function simpleLangOfWord(byval word)
word = trim(word)
l = new com.sun.star.lang.Locale
if Asc(word) < 128 then
l.Language = "en"
l.Country = "US"
else
l.Language = "ru"
l.Country = "RU"
end if
simpleLangOfWord = l
end function
ну что ж :'( ... буду анализировать ASCII-код
Цитата: mikekaganski от 23 ноября 2024, 17:37Вот примитивная функция, определяющая язык по одной первой букве:
это легко ;D и я уже сделал сам ;D ;D ;D
IF Asc(STR_IN) < 128 THEN
' ----- ENG -------
aLocale.Language = "en" 'Использовать Английский язык
aLocale.Country = "US" 'Использовать Соединенное королевство (США) как страну
'---------------------
ELSE
' ----- RUS -------
aLocale.Language = "ru" 'Использовать Русский язык
aLocale.Country = "RU" 'Использовать Россию как страну
'---------------------
END IF
но всё равно, СПАСИБО !
К ремарке про немецкий в школе и проблемы с английским сейчас : я тоже учил немецкий в школе и универе, но когда я пришел в проект, стал нужен английский и я его начал учить и до сих пор учу, вроде как то получается даже.
К ремарке про "я не программист" - вы программист, раз пишете программу и у вас получается.
Цитата: kompilainenn от 23 ноября 2024, 18:54но когда я пришел в проект, стал нужен английский и я его начал учить и до сих пор учу,
а у меня не хватает времени и на то (учить английский) и на это (макросы) ;D
я ещё и Java хотел поизучать.... но воз и ныне там...
ну или это отговорка, чтоб не учить ;D
ЦитироватьК ремарке про "я не программист"
имелось ввиду, что это не моя профессия, я скорее пытаюсь программировать ;D