[CDR 2024] Установка надстрочных символов не срабатывает

  • Автор темы Автор темы scandi
  • Дата начала Дата начала

scandi

Участник
Топикстартер
Сообщения
5
Реакции
0
При выполнении макроса выдается сообщение об ошибке Object doesn't support this property or method (error 438) на строке:
s.Text.Story.FontPropertiesInRange(i, 2).Position = cdrSuperscriptFontPosition.
Текстовый объект существует и содержит строку типа "23rd". Синтаксис вроде бы соответствует документации, искал информацию на разных форумах, в чате gpt, пока ничего не нашел, что могло бы прояснить ситуацию. Надеюсь на помощь форумчан.
 
а так?
s.Text.FontPropertiesInRange(i, 2).Position = cdrSuperscriptFontPosition
 
Так сообщения об ошибке нет, макрос нормально завершает работу, но изменений в строке не происходит (остается "23rd"). В VBA for Excel . Superscript=True работает, как надо, а в Corel аналог в виде .Position у меня не получается установить. Наверно, можно использовать вставку на другом языке, но не хочется так делать.
 
Вы привели пример из Corel.
 
тогда объясните фразу ...
а в Corel аналог в виде .Position у меня не получается установить.
может код чуть пошире процитируете ...

...
6 лет назад для @izrukvruki писалось это - поглядите код - цитата оттуда - кнопка для суперскрипта

тема была такая
 
Последнее редактирование:
  • Спасибо
Реакции: izrukvruki
В Corel синтаксис такой s.Text.FontProperties.Position = cdrSuperscriptFontPosition,
в Excel Cells(1, 1).Characters.Font.Superscript = True. Цель одна и та же - установить надстрочный символ, а результат разный. То что не приносит результата в первом случае, работает во втором. (Понятно, что vba CorelDraw и Excel - это разные продукты.)

По поводу кода: он объемный и не хочется захламлять тему. Со страницы документа берется текстовый шейп, если в его строке есть числительное с окончанием (например, "1st"), то при помощи FontProperties.Position просто требуется окончание числительного на английском языке сделать надстрочным символом. Все стандартно.

Тему с кнопкой прочитал ранее, уперся в то, что собственно кода там нет (может просто не нашел). Тот код, что присутствует, запускает другое приложение UF.Show.
 
запускает другое приложение UF.Show
приложение юзерформу которая тоже имеет свой код - разберитесь
vba CorelDraw и Excel - это разные продукты
один и тот же - VisualBasic for Application © MS - вот как раз Application и разные - каждое со своими скелетами в шкафу
он объемный и не хочется захламлять тему.
хозяин - барин
 
  • Спасибо
Реакции: scandi
Похоже на баг в реализации объектной модели. Из четырёх прописанных вариантов
cdrNormalFontPosition 0 Specifies normal font position
cdrSubscriptFontPosition 1 Specifies subscript font position
cdrSuperscriptFontPosition 2 Specifies superscipt font position
cdrMixedFontPosition 3 Specifies mixed font position
принимаются только варианты cdrNormalFontPosition (0) и cdrSubscriptFontPosition (1)
 
  • Спасибо
Реакции: scandi

dastin

Нашел ошибку, в FontPropertiesInRange(i, 2) переменная i неправильно вычислялась. Сейчас все работает. Благодарю за пинок в правильном направлении.

lev

Очень странный баг. Из нескольких тысяч текстовых объектов у меня часть правильно отрабатывает, часть оставляет как было. Буду дальше искать.

Наверно, тему можно закрывать.
 
Проводил опыты на CorelDRAW 2020 и т.к. не видел в нём свойства Text.FontPropertiesInRange, то отнёс это на разность версий корела, поэтому экспериментировал с Text.Story.Characters(i).Position = cdrSubscriptFontPosition (cdrSuperscriptFontPosition и т.д.) где и проявляется данный баг.
FontPropertiesInRange оказался скрытым свойством, поэтому и не предлагался мне движком. Интернетовский пример с FontPropertiesInRange и Superscript'ом вполне себе рабочий и на нём у меня данный баг не проявляется. Т.е. всё отрабатывает как надо.
Код:
Sub CharacterToSuperscript2()
  Dim p As Page, s As Shape, t As TextRange, sr As ShapeRange
  Dim i&, myReplaceFont$, myCharacterToFind$, j&
  myCharacterToFind = "©"  'changes this character to superscript
  myReplaceFont = "Arial"  'changes character to this font
  j = ActiveDocument.ActivePage.Index
  For Each p In ActiveDocument.Pages
    p.Activate
    Set sr = ActivePage.Shapes.FindShapes(, cdrTextShape)
    For Each s In sr
      For i = 1 To s.Text.Story.Characters.Count
        Set t = s.Text.Story.Characters(i)
        If t = myCharacterToFind Then s.Text.FontPropertiesInRange(i, 1).Position = cdrSuperscriptFontPosition
      Next i
    Next s
  Next p
  ActiveDocument.Pages(j).Activate
End Sub