Как установить курсор в настоящее время после удаления строки активного CodePane в надстройке ms-access VBE?

Я написал надстройку C # для VBA-редактора ms-access. См.: Как написать надстройку для среды разработки: Microsoft Visual Basic для приложений

Моя надстройка ищет код, отмечает его и — после второго клика — удаляет.

В активном модуле есть три строки кода:

Option Compare Database
'Delete This
Option Explicit

Это код, который я использую (конечно, сводится к проблеме):

int m_called = 0;
protected override void button_Click(CommandBarButton Ctrl, ref bool CancelDefault)
{
    if (m_called == 0)
    {
        m_VBE.ActiveCodePane.SetSelection(2, 1, 2, 13);
    }
    else
    {
        m_VBE.ActiveCodePane.CodeModule.DeleteLines(2, 1);
        m_VBE.ActiveCodePane.SetSelection(2, 2, 2, 2);
    }
    m_called++;
}

После запуска этого кода выбираются буквы: «Option Expli».

Это происходит только при установке первого выбора через "SetSelection" (первая строка). Вместо этого выбор точно такой же части вручную приводит к правильному положению выбора (= как линейный курсор в начале второй строки перед «Option Explicit»).

Установка курсора на строку 1 будет работать нормально. Установка его на второй символ строки 2 (2, 2, 2, 2; между «O» и «p») также работает. Буквально любая другая позиция, кроме начала второй строки, работает просто отлично!

Так есть ли обходной путь для этой странной ошибки?

Вот что я пробовал:

  • Я дважды вызывал второй SetSelection => результат не меняется
  • Установка выделения перед удалением строки => не меняет результат

person Gener4tor    schedule 06.03.2020    source источник


Ответы (1)


хорошо... вам нужно установить выделение в другое место, прежде чем установить его в начало второй строки.

Так что этот код работает для меня:

int m_called = 0;
protected override void button_Click(CommandBarButton Ctrl, ref bool CancelDefault)
{
    if (m_called == 0)
    {
        m_VBE.ActiveCodePane.SetSelection(2, 1, 2, 13);
    }
    else
    {
        m_VBE.ActiveCodePane.CodeModule.DeleteLines(2, 1);
        m_VBE.ActiveCodePane.SetSelection(1, 1, 1, 1);
        m_VBE.ActiveCodePane.SetSelection(2, 1, 2, 1);
    }
    m_called++;
}
person Gener4tor    schedule 06.03.2020