После установки 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