スクリプトをサポートする C# アプリケーションを開発しています。FoldingStrategy
AvalonEdit のコード折りたたみに使用される Visual Basic コードのサンプルはありますか?
質問する
1464 次
2 に答える
1
このコードで 2 つのエラーが見つかりました。範囲外の例外が 2 つあります。
Do Until text(k - 1) = vbLf OrElse text(k - 1) = vbCr
kが0になると、1行で修正されます:
k -= 1
If k <= 0 Then Exit Do
とで:
Dim startOffset As Integer = startOffsets.Pop()
startOffset が空の場合、次のように修正された場合:
If startOffsets.Count > 0 Then
Dim startOffset As Integer = startOffsets.Pop()
.....
End If
しかし、Folding 生成は InlineSubs で失敗します。この例を試してください:
Public Class Window
Public Sub New()
InitializeComponent()
AddHandler TextBox.TextChanged, Sub(TBsender As Object, TBe As EventArgs)
CheckCode()
End Sub
End Sub
End Class
この最後の問題を解決できませんでした。
于 2014-06-06T15:21:47.670 に答える
1
これは私が作成したもので、動作しているように見えます...かなりうまくいきます。考えられる多くの状況を考慮していないため、完璧ではありませんが、これは出発点です。
Imports ICSharpCode.AvalonEdit.Folding
Imports ICSharpCode.AvalonEdit.Document
Public Class VBNETFoldingStrategy
Inherits AbstractFoldingStrategy
Private foldableKeywords() As String = {"namespace", "class", "sub", "function", "structure", "enum"}
Public Overrides Function CreateNewFoldings(document As ICSharpCode.AvalonEdit.Document.TextDocument, ByRef firstErrorOffset As Integer) As System.Collections.Generic.IEnumerable(Of ICSharpCode.AvalonEdit.Folding.NewFolding)
firstErrorOffset = -1
Dim foldings As New List(Of NewFolding)
Dim text As String = document.Text
Dim lowerCaseText As String = text.ToLower()
For Each foldableKeyword In foldableKeywords
foldings.AddRange(GetFoldings(text, lowerCaseText, foldableKeyword))
Next
Return foldings.OrderBy(Function(f) f.StartOffset)
End Function
Public Function GetFoldings(text As String, lowerCaseText As String, keyword As String) As IEnumerable(Of NewFolding)
Dim foldings As New List(Of NewFolding)
Dim closingKeyword As String = "end " + keyword
Dim closingKeywordLength As String = closingKeyword.Length
keyword += " "
Dim keywordLength As String = keyword.Length
Dim startOffsets As New Stack(Of Integer)
For i As Integer = 0 To text.Length - closingKeywordLength
If lowerCaseText.Substring(i, keywordLength) = keyword Then
Dim k As Integer = i
If k <> 0 Then
Dim lastLetterPos As Integer = i
Do Until text(k - 1) = vbLf OrElse text(k - 1) = vbCr
If Char.IsLetter(text(k)) Then lastLetterPos = k
k -= 1
Loop
If lastLetterPos > k Then k = lastLetterPos
End If
startOffsets.Push(k)
ElseIf lowerCaseText.Substring(i, closingKeywordLength) = closingKeyword Then
Dim startOffset As Integer = startOffsets.Pop()
Dim newFolding As NewFolding = New NewFolding(startOffset, i + closingKeywordLength)
Dim p As Integer = text.IndexOf(vbLf, startOffset)
If p = -1 Then p = text.IndexOf(vbCr, startOffset)
If p = -1 Then p = text.Length - 1
newFolding.Name = text.Substring(startOffset, p - startOffset)
foldings.Add(newFolding)
End If
Next
Return foldings
End Function
End Class
于 2012-08-31T03:12:09.170 に答える