Как установить курсор в данный момент после удаления строки активной CodePane в VBE-надстройке ms-access? - PullRequest
1 голос
/ 06 марта 2020

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

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

Активный модуль содержит три строки кода:

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 => не меняет результат
  • Установка выбора перед удалением строки => не меняет результат

1 Ответ

1 голос
/ 06 марта 2020

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

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

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++;
}
...