Частичная проверка подчеркивания для фигуры в Powerpoint не работает? - PullRequest
0 голосов
/ 19 ноября 2018
ppShape.TextFrame.TextRange.Font.Underline == MsoTriState.msoTrue
ppShape.TextFrame.TextRange.Font.Underline == MsoTriState.msoFalse
ppShape.TextFrame.TextRange.Font.Underline == MsoTriState.msoTriStateMixed

Приведенный выше код проверяет, имеет ли форма PowerPoint ... 1. весь текст подчеркнут 2. весь текст не подчеркнут 3. частичный текст подчеркнут

3-й пункт, частичный текстподчеркнутые не работают и возвращают ложные или истинные значения случайным образом для смешанного подчеркивающего текста в форме.

Это прекрасно работает для жирного и курсивного шрифта, т. е.

ppShape.TextFrame.TextRange.Font.Bold == MsoTriState.msoTriStateMixed
ppShape.TextFrame.TextRange.Font.Italic == MsoTriState.msoTriStateMixed

Я также поднял вопрос с Microsoft об этой проблемездесь, в GitHub, https://github.com/MicrosoftDocs/VBA-Docs/issues/462

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

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Спасибо за то, что пролили свет на методы TextRange.Runs, что действительно замечательная функция, которая также экономит много производительности, а не циклический символ.

Я создал аналогичную функцию в C # .Net, чтобы использовать ее аналогично функции по умолчанию.

using pp = Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;

public static MsoTriState IsUnderlined(pp.Shape parShape)
{
    int cntUnderline = 0;

    foreach (pp.TextRange textTR in parShape.TextFrame.TextRange.Runs())
    {
        if (textTR.Font.Underline == MsoTriState.msoTrue)
        {
            cntUnderline++;
        }
    }

    if (cntUnderline == 0)
    {
        //No Underline
        return MsoTriState.msoFalse;
    }
    else if (parShape.TextFrame.TextRange.Runs().Count == cntUnderline)
    {
        //All Underline
        return MsoTriState.msoTrue;
    }
    else if (parShape.TextFrame.TextRange.Runs().Count != cntUnderline)
    {
        //Mixed Underline
        return MsoTriState.msoTriStateMixed;
    }

    return MsoTriState.msoTriStateToggle; //Consider as error
}
0 голосов
/ 19 ноября 2018

В качестве обходного пути вы можете проверить каждый прогон в TextRange. В VBA вы можете передать форму функции, подобной этой:

Function IsUnderlined(oSh As Shape) As Boolean
    Dim oRng As TextRange
    For Each oRng In oSh.TextFrame.TextRange.Runs
        If oRng.Font.Underline Then
            IsUnderlined = True
            Exit Function
        End If
    Next
End Function

Если какой-либо символ в тексте подчеркнут, функция вернет True.

...