IntelliSense mit dem Digitalrune Text Editor Control

    • VB.NET

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von newer.

      IntelliSense mit dem Digitalrune Text Editor Control

      Hey,
      in diesem Tutorial möchte ich euch zeigen, wie ihr mit dem Digitalrune TextEditorControl IntelliSense bekommt. Wer nicht weiß, was IntelliSense ist, *klick*

      Ihr braucht als erstes das TexteditorControl, hier ist ein Tutorial, wie ihr es bekommt. Als nächstes ziehen wir das Control in unsere Toolbox (HowTo ) und ziehen es anschließend auf unsere Form. Ich benenne das "TextEditorControl1" noch in "TextEditor" um. Danach gehen wir in die Code-Ansicht. Als erstes OPTION STRICT ON. Danach brauchen wir ein paar Imports:

      VB.NET-Quellcode

      1. Imports DigitalRune.Windows.TextEditor.Completion
      2. Imports DigitalRune.Windows.TextEditor


      Dann erstellen wir eine neue, öffentliche Klasse. Meine heißt "CodeCompletionDataProvider"

      VB.NET-Quellcode

      1. Public Class CodeCompletionDataProvider
      2. End Class


      Wir erben von "AbstractCompletionDataProvider", also kommt in die erste Zeile unsere Klasse:

      VB.NET-Quellcode

      1. Inherits AbstractCompletionDataProvider



      Wir erstellen uns eine ImageList, wo die Icons der Methoden/Eigenschaften reinkommen. Ein paar davon könnt ihr unten downloaden.

      VB.NET-Quellcode

      1. Private _imageList As New ImageList



      Danach erstellen wir eine neue Property, wo wir die ImageList zurückgeben:

      VB.NET-Quellcode

      1. Public Overrides ReadOnly Property ImageList() As ImageList
      2. Get
      3. Return _imageList
      4. End Get
      5. End Property


      Jetzt müssen wir noch Bilder der Imagelist hinzufügen, das machen wir in der Sub New.

      VB.NET-Quellcode

      1. Public Sub New()
      2. _imageList.Images.Add(My.Resources.field)
      3. _imageList.Images.Add(My.Resources.method)
      4. _imageList.Images.Add(My.Resources.TextFile)
      5. End Sub


      Als nächstes erstellen wir eine neue Function, das Herz unserer IntelliSense:

      VB.NET-Quellcode

      1. Public Overrides Function GenerateCompletionData(fileName As String, textArea As TextArea, charTyped As Char) As ICompletionData()
      2. End Function



      Wir erstellen eine neue Variable, unser Rückgabewert:

      VB.NET-Quellcode

      1. Dim completionData As New List(Of ICompletionData)()



      Jetzt können wir ganz einfach mit completionData.Add Einträge hinzufügen:

      VB.NET-Quellcode

      1. completionData.Add(New DefaultCompletionData("Unser Text", "Unsere Beschreibung", 0))


      Zur Erklärung:
      Wir erstellen eine neue DefaultCompletionData. Als Parameter müssen wir einmal den Text (Bsp: Messagebox) und dann die Beschreibung (Bsp: Zeigt eine MessageBox an) übergeben. Außerdem müssen wir noch den Index des Images, welches wir als Icon haben wollen, angeben.

      Wenn wir viele Einträge hinzufügen wollen, könnt ihr auch folgendes schreiben:

      VB.NET-Quellcode

      1. Dim completionData As New List(Of ICompletionData)() From { _
      2. New DefaultCompletionData("MessageBox", "Zeigt eine MessageBox an.", 0), _
      3. New DefaultCompletionData("String", "Eine Zeichenkette", 1), _
      4. New DefaultCompletionData("CInt", "Konvertiert zu einem Integer", 2)}


      Außerdem können wir noch Snippets hinzufügen:

      VB.NET-Quellcode

      1. completionData.Add(New SnippetCompletionData(New Snippet("For", "For i As Integer = 0 To Bla.Count -1" & Environment.NewLine & "|" & Environment.NewLine & "Next", "Eine Schleife"), 1))



      Im ersten Parameter bei new Snippet geben wir den Aufruf an (wie Text bei DefaulData...). Danach sagen wir, wie es nach eine Bestätigung aussieht. | ist die Postion des Cursors (Man macht den Strich mit Alt Gr und "<"). Als letzten Parameter bei New Snippet geben wir die Beschreibung an. Bei New SnippetCompletionData geben wir als ersten Parameter den Snippet und als zweiten den Index des Bildes in der _ImageList an. Wenn ihr viele Snippets hinzufügen wollt, bietet sich folgende Lösung an:

      VB.NET-Quellcode

      1. Dim snippets As New List(Of Snippet)() From {New Snippet("For", "For i As Integer = 0 To Bla.Count -1" & Environment.NewLine & "|" & Environment.NewLine & "Next", "Eine Schleife"), _
      2. New Snippet("Do", "Do While 1 > 9" & Environment.NewLine & "|" & Environment.NewLine & "Loop", "Endlosschleife")}
      3. For Each snippet As Snippet In snippets
      4. completionData.Add(New SnippetCompletionData(snippet, 1))
      5. Next


      Als letztes geben wir noch unsere List Of zurück und sind dann auch fertig mit der Klasse:

      VB.NET-Quellcode

      1. Return completionData.ToArray()



      Als nächstes gehen wir wieder in unsere Klasse der Form und rufen das Event "CompletionRequest" vom TextEditorControl auf:

      VB.NET-Quellcode

      1. Private Sub CompletitionRequest(ByVal sender As Object, ByVal e As CompletionEventArgs) Handles TextEditor.CompletionRequest
      2. End Sub


      Da schreiben wir folgendes rein:

      VB.NET-Quellcode

      1. Dim xCom As New CodeCompletionDataProvider()
      2. If e.Key = vbNullChar Then
      3. TextEditor.ShowCompletionWindow(xCom, e.Key, False)
      4. End If
      5. If Char.IsLetter(e.Key) Then
      6. Try
      7. TextEditor.ShowCompletionWindow(xCom, e.Key, True)
      8. Catch ex As Exception
      9. End Try
      10. End If


      Jetzt funktioniert das ganze. Danke fürs lesen, ich freue mich über Rückmeldung.

      Download von einem Beispielprojekt
      Download von ein paar Icons
      Download von einer Anwendung, die die IntelliSense nutzt (Die Datei vom Projekt)

      Das ganze mal in einem Stück:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports DigitalRune.Windows.TextEditor.Completion
      3. Imports DigitalRune.Windows.TextEditor
      4. Public Class frm_main
      5. Private Sub CompletitionRequest(ByVal sender As Object, ByVal e As CompletionEventArgs) Handles TextEditor.CompletionRequest
      6. Dim xCom As New CodeCompletionDataProvider()
      7. If e.Key = vbNullChar Then
      8. TextEditor.ShowCompletionWindow(xCom, e.Key, False)
      9. End If
      10. If Char.IsLetter(e.Key) Then
      11. Try
      12. TextEditor.ShowCompletionWindow(xCom, e.Key, True)
      13. Catch ex As Exception
      14. End Try
      15. End If
      16. End Sub
      17. End Class
      18. Public Class CodeCompletionDataProvider
      19. Inherits AbstractCompletionDataProvider
      20. Private _imageList As New ImageList
      21. Public Overrides ReadOnly Property ImageList() As ImageList
      22. Get
      23. Return _imageList
      24. End Get
      25. End Property
      26. Public Sub New()
      27. _imageList.Images.Add(My.Resources.field)
      28. _imageList.Images.Add(My.Resources.method)
      29. _imageList.Images.Add(My.Resources.TextFile)
      30. End Sub
      31. Public Overrides Function GenerateCompletionData(fileName As String, textArea As TextArea, charTyped As Char) As ICompletionData()
      32. Dim completionData As New List(Of ICompletionData)() From { _
      33. New DefaultCompletionData("MessageBox", "Igendso ne Nachrichtenbox.", 0), _
      34. New DefaultCompletionData("MsgBox", "Es gibt da was neueres, ne MessageBox.", 0), _
      35. New DefaultCompletionData("Dim", "Zum deklarieren von Datentypen.", 0), _
      36. New DefaultCompletionData("String", "Ne Zeichenkette", 0)}
      37. Dim snippets As New List(Of Snippet)() From {New Snippet("For", "For i As Integer = 0 To Bla.Count -1" & Environment.NewLine & "|" & Environment.NewLine & "Next", "Eine Schleife"), _
      38. New Snippet("Do", "Do While 1 > 9" & Environment.NewLine & "|" & Environment.NewLine & "Loop", "Endlosschleife")}
      39. For Each snippet As Snippet In snippets
      40. completionData.Add(New SnippetCompletionData(snippet, 1))
      41. Next
      42. Return completionData.ToArray()
      43. End Function
      44. End Class
      Dateien
      • Icons.zip

        (912 Byte, 403 mal heruntergeladen, zuletzt: )
      Mfg
      Vincent

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VincentTB“ ()

      Fehlermeldung

      Ich bekomme folgende Fehlermeldung, bei der Anwendung deines Codes! ohne die Anpassung arbeitet das Control einwandfrei!

      Error:

      Quellcode

      1. Attempted to read or write protected memory. This is often an indication that other memory is corrupt.


      MfG