Перемещение точки редактирования

Оценить
(0 голоса)

После установки Edit Point вы можете перенести ее в любое заданное место документа (при помощи различных методов). Методы CharLeft и CharRight переносят точку на лю­бое количество символов влево или вправо, в то время как методы WordLeft и WordRight выполняют то же самое для слов:

' Перенести точку редактирования на 4 слова вправо epStart.WordRight(4)

Методы LineUp и Line Down переносят точку на указанное количество строк вверх или вниз. Вы можете также перенести Edit Point на любую заданную строку документа при помощи метода MoveToLineAndOf f set. Этот метод также помещает точку в определенную позицию строки:

' Перенести точку редактирования в строку 100, а затем на.5 символов вправо epStart.MoveToLineAndOffset(100, 5)

Код макроса в листинге 11.11 сводит воедино некоторые из рассмотренных нами вопросов редактирования текстовых документов. Этот макрос и поддерживающие его функции иллю­стрируют использование EditPoint для записи текста в документ. В данном случае макрос автоматически вставляет блок комментариев непосредственно перед процедурой. Для этого макрос делает следующее:

1.   Получает ссылку на текущий документ в интегрированной среде.

2.   При помощи свойства TextDocument. Selection. ActivePoint определяется активное положение курсора в этом документе.

3.   При помощи VirtualPoint (возвращенного из ActivePoint) создается EditPoint.

4.   Затем создается второй EditPoint; эти две точки используются для получения всего содержимого строки определения процедуры.

5.   Определение процедуры затем подвергается синтаксическому разбору (для того чтобы определить название, возвращаемое значение и список параметров).

6.   При помощи информации о процедуре создается строка, которая вставляется в тексто­вый документ при помощи EditPoint.

Imports EnvDTE Imports EnvDTE80

Imports Microsoft.VisualStudio.CommandBars

Imports System

Imports System.Collections

Imports System.Diagnostics Imports System.Text Imports System.Windows.Forms

Public Module MacroExamples

' Данная процедура демонстрирует различные сценарии редактирования текста ' при помощи типов EditPoint и TextPoint. Если вы поместите ваш курсор ' на процедуру или функцию, то она создаст стандартный блок комментариев,

' вставит его непосредственно над процедурой и включит ' его в структуру документа.

' Для использования:

' - поместите курсор в любую строку процедуры или функции;

« * * ' - запустите макрос.

' Если макрос не сможет определить начало процедуры или функции,

' то он закончится неудачей (не вставит никаких комментариев)

1 без всякой выдачи сообщений

Public Sub InsertTemplateFlowerbox()

I

' Получить ссылку на активный документ Dim doc As Document = DTE.ActiveDocument

i

Dim txtDoc As TextDocument = doc.Object Dim isFunc As Boolean

Try

Dim ep As EditPoint2 = txtDoc.Selection.ActivePoint.CreateEditPoint() ep.StartOfLine()

Dim ep2 As EditPoint2 = ep.CreateEditPoint() ep2.EndOfLine()

Dim lineText As String = ep.GetText(ep2).Trim()

If InStr(lineText, " Function ") > 0 Then isFunc = True Elself InStr(lineText, " Sub ") > 0 Then isFunc = False Else

Exit Sub End If

' Произвести анализ информации, которую мы можем получить из 1 определения процедуры: тип возвращаемого значения (если это ' функция), названия параметров и название процедуры.

      it и

Dim returnType As String =

If isFunc Then

returnType = ParseRetValueType(lineText)

End If

Dim parameters As String() = ParseParameters(lineText)

Dim name As String = ParseRoutineName(lineText)

Dim commentBlock As String = BuildCommentBlock(isFunc, name, _

returnType, parameters)

' Перенести точку редактирования на одну строку вверх (для того ' чтобы попасть в точку непосредственно перед процедурой) ер.LineUp(1)

' Создать немного свободного пространства путем вставки пустой строки ер.InsertNewLine()

' Вставить наш блок комментариев ер.Insert(commentBlock.ToString())

Catch ex As Exception

End Try

End Sub

Private Function BuildCommentBlock(ByVal isFunc As Boolean, _

ByVal name As String, _

ByVal returnType As String, ByVal parameters As String())

Try

Dim comment As StringBuilder = New StringBuilder()

' Создать блок комментариев при помощи переданной информации comment Append^>>>>*>>|>>>,>*>>>>>,>>>>>>1>,,,>1|>>**>**,,>>>>*,1,>^

comment.Append(vbCrLf)

comment.Append('" Routine: " + name)

comment.Append(vbCrLf)

comment.Append('" Description: [insert routine desc here]") comment.Append(vbCrLf) comment.Append(" "') comment.Append(vbCrLf)

If isFunc Then

comment.Append("' Returns: A " & returnType & _

" [insert return value description here]")

End' If

comment.Append(vbCrLf)

comment. Append (  )

comment.Append(vbCrLf) comment.Append("' Parameters:") comment.Append(vbCrLf)

For i As Integer = 0 To parameters.GetUpperBound(0)

comment. Append (  )

comment.Append(parameters(i) )

comment.Append(": [insert parameter description here]") comment.Append(vbCrLf)

Next

comment .Append                  )

Return comment.ToString()

Catch ex As Exception Return ""

End Try End Function

Private Function ParseRetValueType(ByVal code As String) As String Try

' Проанализировать возвращенное из функции значение.

' Ищем 'As', начиная с конца строки.

Dim length As Integer - code.Length

Dim index As Integer = code.LastlndexOf(" As ")

Dim retVal As String = code.Substring(index + 3, length - (index + 3)) Return retVal.Trim()

Catch ex As Exception Return ""

End Try End Function

Private Function ParseParameters(ByVal code As String) As String()

Try

' Проанализировать указанные в определении процедуры/функции ' параметры (если они есть)

Dim length As Integer = code.Length

Dim indexStart As Integer = code.IndexOf("(")

Dim indexEnd As Integer = code.LastlndexOf(")")

Dim params As String = code.Substring(indexStart + 1, _

indexEnd - (indexStart + 1) )

Return params.Split(",")

Catch ex As Exception Return Nothing End Try End Function

Private Function ParseRoutineName(ByVal code As String) As String Try

Dim name As String

Dim length As Integer = code.Length

Dim indexStart As Integer = code.IndexOf(" Sub ")

Dim indexEnd As Integer = code.IndexOf("(")

If indexStart = -1 Then

indexStart = code.IndexOf(" Function ")

If indexStart <> -1 Then indexStart = indexStart + 9 End If Else

indexStart = indexStart + 5 End If

name = code.Substring(indexStart, indexEnd - indexStart)

Return name.Trim()

Catch ex As Exception Return ,,M End Try End Function End Module

Объекты команд
Выполнение команды
Соответствие привязок клавиш
Объекты отладчика
События расширяемости

Добавить комментарий


Защитный код
Обновить

© 2017 www.visualstudios.ru. Все права защищены.