CNC Editor farbige Schrift, Zeilennummerierung

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    CNC Editor farbige Schrift, Zeilennummerierung

    Hallo,
    wie die Überschrift schon sagt, möchte ich einen CNC-Editor schreiben.
    Es gibt eine große Rich- oder Textbox in der das CNC Programm geschrieben wird.
    Dort sollen nun Codes wie z.B. "G0","G1","G81" in rot stehen, die Adressdaten "X20","Y100","Z0" in blau und z.B. der Vorschubwert "F500" in grün.
    Des weiteren soll am Anfang der Zeile ein "N" mit der Zeilennnummer dahinter stehen.
    Die Zeilennummer wird in einer zweiten Textbox angezeigt, die links daneben ist. Das Problem ist dann beim Scrollen- kann mann die zwei Textbox Scrolls irgendwie verbinden?
    Das mit den verschiedenen Farben habe ich auch schon probiert, dass geht dann aber nur beim ersten "G0", dass sich der Text rot färbt.


    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    If TextBox1.Text = ("G0") Then
    TextBox1.ForeColor = Color.Red
    End If
    End Sub

    chke93 schrieb:

    kann mann die zwei Textbox Scrolls irgendwie verbinden?
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Frohe Ostern!!

    RodFromGermany schrieb:

    Gugst Du hier.

    Den habe ich jetzt genommen und auf 2 Richtextboxen geändert. Das Problem ist jetzt, sobald meine Richtextbox voll mit Text ist, sodass ich scrollen müsste, hängt sich das gebuggte Programm auf.
    Mein Mauszeiger ist dann immer hinter dem Programm.Ich kann auf keinen Button mehr klicken.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „chke93“ ()

    chke93 schrieb:

    Hier ist der Code:
    Kannst Du bitte mal Deinen Beitrag editieren und Deinen Code 1. mit dwem [VB]-Tag einschließen und 2. Code und VB-Tags mit einem Expander [+] umschließen?
    Nutze den Vorschau-Button.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kannst Du bitte mal Deinen Beitrag editieren und Deinen Code 1. mit dwem [VB-Tag einschließen und 2. Code und VB-Tags mit einem Expander [+] umschließen?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Data
    4. Imports System.Text
    5. Imports System.Drawing
    6. Imports System.Collections
    7. Imports System.Windows.Forms
    8. Imports System.Windows.Forms.Message
    9. Imports System.Runtime.InteropServices.Marshal
    10. Public Class Form1
    11. Inherits System.Windows.Forms.Form
    12. '"Windows Form Designer generated code removed here"
    13. '===================================================================
    14. ' for NativeWindow and PostMessageA
    15. '===================================================================
    16. Private Const WM_HSCROLL = &H114
    17. Private Const WM_VSCROLL = &H115
    18. Private Const WM_MOUSEWHEEL = &H20A
    19. Private Const WM_COMMAND = &H111
    20. Private Const WM_USER = &H400
    21. '===================================================================
    22. ' for GetScroll and PostMessageA
    23. '===================================================================
    24. Private Const SBS_HORZ = 0
    25. Private Const SBS_VERT = 1
    26. Private Const SB_THUMBPOSITION = 4
    27. '===================================================================
    28. ' for SubClassing
    29. '===================================================================
    30. Private WithEvents sClass1 As Subclass
    31. Private WithEvents sClass2 As Subclass
    32. Private WithEvents sClass3 As Subclass
    33. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    34. ' clear the rtb text
    35. RichTextBox1.Text = ""
    36. RichTextBox2.Text = ""
    37. ' setup the sSubclass
    38. sClass1 = New Subclass(RichTextBox1.Handle)
    39. sClass2 = New Subclass(RichTextBox2.Handle)
    40. Dim i As Integer
    41. ' put some formated text in the RichTextBox's
    42. While i < 100
    43. RichTextBox1.AppendText(" this is a string " & i & vbCrLf)
    44. RichTextBox2.AppendText(" this is a string " & i & vbCrLf)
    45. If i Mod 4 = 0 Then
    46. RichTextBox1.AppendText( _
    47. " this is a longer string to force HScroll " & i & vbCrLf)
    48. RichTextBox2.AppendText( _
    49. " this is a longer string to force HScroll " & i & vbCrLf)
    50. End If
    51. i += 1
    52. End While
    53. End Sub
    54. Public Sub sClass_WindowProcedure(ByRef uMsg As Message) Handles sClass1.WindowProcedure, sClass2.WindowProcedure
    55. Select Case uMsg.Msg
    56. Case WM_VSCROLL ' WM_VSCROLL Message's for RTB's
    57. If uMsg.HWnd.Equals(RichTextBox1.Handle) Then
    58. 'Debug.WriteLine(GetLowWord(uMsg.WParam.ToInt32))
    59. RemoveHandler sClass2.WindowProcedure, _
    60. AddressOf sClass_WindowProcedure
    61. Dim msg1 As Message
    62. Dim msg2 As Message
    63. msg1 = uMsg.Create(RichTextBox2.Handle, _
    64. uMsg.Msg, uMsg.WParam, uMsg.LParam)
    65. sClass2.SendWndProc(msg1)
    66. sClass2.SendWndProc(msg2)
    67. AddHandler sClass2.WindowProcedure, _
    68. AddressOf sClass_WindowProcedure
    69. End If
    70. If uMsg.HWnd.Equals(RichTextBox2.Handle) Then
    71. RemoveHandler sClass2.WindowProcedure, _
    72. AddressOf sClass_WindowProcedure
    73. Dim msg1 As Message
    74. Dim msg2 As Message
    75. msg1 = uMsg.Create(RichTextBox1.Handle, _
    76. uMsg.Msg, uMsg.WParam, uMsg.LParam)
    77. sClass2.SendWndProc(msg1)
    78. sClass2.SendWndProc(msg2)
    79. AddHandler sClass2.WindowProcedure, _
    80. AddressOf sClass_WindowProcedure
    81. End If
    82. Case WM_HSCROLL ' WM_HSCROLL Message's for RTB's
    83. If uMsg.HWnd.Equals(RichTextBox1.Handle) Then
    84. 'Debug.WriteLine(GetLowWord(uMsg.WParam.ToInt32))
    85. RemoveHandler sClass2.WindowProcedure, _
    86. AddressOf sClass_WindowProcedure
    87. Dim msg1 As Message
    88. Dim msg2 As Message
    89. msg1 = uMsg.Create(RichTextBox2.Handle, _
    90. uMsg.Msg, uMsg.WParam, uMsg.LParam)
    91. sClass2.SendWndProc(msg1)
    92. sClass2.SendWndProc(msg2)
    93. AddHandler sClass2.WindowProcedure, _
    94. AddressOf sClass_WindowProcedure
    95. End If
    96. If uMsg.HWnd.Equals(RichTextBox2.Handle) Then
    97. RemoveHandler sClass2.WindowProcedure, _
    98. AddressOf sClass_WindowProcedure
    99. Dim msg1 As Message
    100. Dim msg2 As Message
    101. msg1 = uMsg.Create(RichTextBox1.Handle, _
    102. uMsg.Msg, uMsg.WParam, uMsg.LParam)
    103. sClass2.SendWndProc(msg1)
    104. sClass2.SendWndProc(msg2)
    105. AddHandler sClass2.WindowProcedure, _
    106. AddressOf sClass_WindowProcedure
    107. End If
    108. End Select
    109. End Sub
    110. Private Sub RichTextBox1_VScroll(ByVal sender As Object,ByVal e As System.EventArgs) Handles RichTextBox1.VScroll
    111. Dim RTB1Position As Integer
    112. RTB1Position = GetScrollPos(RichTextBox1.Handle, SBS_VERT)
    113. PostMessageA(RichTextBox2.Handle, WM_VSCROLL,SB_THUMBPOSITION + &H10000 * RTB1Position, 0)
    114. End Sub
    115. Private Sub RichTextBox2_VScroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles RichTextBox2.VScroll
    116. Dim RTB2Position As Integer
    117. RTB2Position = GetScrollPos(RichTextBox2.Handle, SBS_VERT)
    118. PostMessageA(RichTextBox1.Handle, WM_VSCROLL, SB_THUMBPOSITION + &H10000 * RTB2Position, 0)
    119. End Sub
    120. Private Sub RichTextBox1_HScroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles RichTextBox1.HScroll
    121. Dim RTB1Position As Integer
    122. RTB1Position = GetScrollPos(RichTextBox1.Handle, SBS_HORZ)
    123. PostMessageA(RichTextBox2.Handle, WM_HSCROLL, SB_THUMBPOSITION + &H10000 * RTB1Position, 0)
    124. End Sub
    125. Private Sub RichTextBox2_HScroll(ByVal sender As Object, _
    126. ByVal e As System.EventArgs) Handles RichTextBox2.HScroll
    127. Dim RTB2Position As Integer
    128. RTB2Position = GetScrollPos(RichTextBox2.Handle, SBS_HORZ)
    129. PostMessageA(RichTextBox1.Handle, WM_HSCROLL, SB_THUMBPOSITION + &H10000 * RTB2Position, 0)
    130. End Sub
    131. '===================================================================
    132. ' API Function: GetScrollPos
    133. '===================================================================
    134. Private Declare Function GetScrollPos Lib "user32.dll" ( _
    135. ByVal hWnd As IntPtr, _
    136. ByVal nBar As Integer) As Integer
    137. '===================================================================
    138. ' API Function: PostMessageA
    139. '===================================================================
    140. Private Declare Function PostMessageA Lib "user32.dll" ( _
    141. ByVal hwnd As IntPtr, _
    142. ByVal wMsg As Integer, _
    143. ByVal wParam As Integer, _
    144. ByVal lParam As Integer) As Boolean
    145. '===================================================================
    146. ' Temporary Functions for the Debugger
    147. '===================================================================
    148. Public Function GetLowWord(ByRef pintValue As Int32) As Int32
    149. Return pintValue And &HFFFF
    150. End Function
    151. Public Function GetLowWord(ByRef pudtValue As IntPtr) As Int32
    152. Return GetLowWord(pudtValue.ToInt32)
    153. End Function
    154. Public Function GetHighWord(ByRef pintValue As Int32) As Int32
    155. If (pintValue And &H80000000) = &H80000000 Then
    156. Return CInt(((pintValue And &H7FFF0000) \ &H10000) Or &H8000&)
    157. Else
    158. Return (pintValue And &HFFFF0000) \ &H10000
    159. End If
    160. End Function
    161. '===================================================================
    162. ' End Temporary Functions for the Debugger
    163. '===================================================================
    164. End Class
    165. Public Class Subclass
    166. '===================================================================
    167. ' NativeWindow Subclassing
    168. '===================================================================
    169. Inherits System.Windows.Forms.NativeWindow
    170. Public Event WindowProcedure(ByRef uMsg As Message)
    171. Public Sub New(ByVal pWindowHandle As IntPtr)
    172. MyBase.AssignHandle(pWindowHandle)
    173. End Sub
    174. Protected Overrides Sub WndProc(ByRef uMsg As System.Windows.Forms.Message)
    175. MyBase.WndProc(uMsg)
    176. RaiseEvent WindowProcedure(uMsg)
    177. End Sub
    178. Public Sub SendWndProc(ByRef uMsg As System.Windows.Forms.Message)
    179. MyBase.WndProc(uMsg)
    180. End Sub
    181. End Class


    So vielleicht :S OK, jetzt hab ich es geschnallt!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „chke93“ ()

    chke93 schrieb:

    So vielleicht

    RodFromGermany schrieb:

    Kannst Du bitte mal Deinen Beitrag editieren
    Dies ist ein Expander
    Dies ist ein Expander
    Dies ist ein Expander
    Dies ist ein Expander
    Dies ist ein Expander
    Dies ist ein Expander
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Gonger96 schrieb:

    Ich kann dir Folgendes empfehlen Fast Colored Textbox
    Danke dafür!
    ich habe mal den Code probiert aber leider werden bei mir fehler in C# angezeigt,deshalb habe ichen Code in Visual Basic konvertiert aber er weist leider wieder ein paar fehler auf, die ich nicht weg bekomme.
    Welchen Text brauche ich denn?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. public class TextStyle : Style{
    2. public Brush ForeBrush { get; set; }
    3. public Brush BackgroundBrush { get; set; }
    4. public FontStyle FontStyle { get; set; }
    5. public override void Draw(Graphics gr, Point position, Range range)
    6. {
    7. //draw background
    8. if (BackgroundBrush != null)
    9. gr.FillRectangle(BackgroundBrush, position.X, position.Y,
    10. (range.End.iChar - range.Start.iChar) *
    11. range.tb.CharWidth, range.tb.CharHeight);
    12. //draw chars
    13. Font f = new Font(range.tb.Font, FontStyle);
    14. Line line = range.tb[range.Start.iLine];
    15. float dx = range.tb.CharWidth;
    16. float y = position.Y - 2f;
    17. float x = position.X - 2f;
    18. Brush foreBrush = this.ForeBrush ?? new SolidBrush(range.tb.ForeColor);
    19. for (int i = range.Start.iChar; i < range.End.iChar; i++)
    20. {
    21. //draw char
    22. gr.DrawString(line[i].c.ToString(), f, foreBrush, x, y);
    23. x += dx;
    24. }
    25. } }

    Spoiler anzeigen

    VB.NET-Quellcode

    1. public class Range{
    2. Place start;
    3. Place end;
    4. }
    5. public struct Place
    6. {
    7. int iLine;
    8. int iChar; }

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Style GreenStyle = new TextStyle(Brushes.Green, null, FontStyle.Italic);...
    2. private void fastColoredTextBox1_TextChanged(object sender, TextChangedEventArgs e)
    3. {
    4. //clear style of changed range
    5. e.ChangedRange.ClearStyle(GreenStyle);
    6. //comment highlighting
    7. e.ChangedRange.SetStyle(GreenStyle, @"//.*$", RegexOptions.Multiline); }
    Das wäre ein Beispiel

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Imports FastColoredTextBoxNS
    3. Public Class Form1
    4. Private GreenStyle As Style = New TextStyle(Brushes.Green, Nothing, FontStyle.Italic)
    5. Private Sub FastColoredTextBox1_Load(ByVal sender As System.Object, ByVal e As TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged
    6. 'clear style of changed range
    7. e.ChangedRange.ClearStyle(GreenStyle)
    8. 'comment highlighting
    9. e.ChangedRange.SetStyle(GreenStyle, "//.*$", RegexOptions.Multiline)
    10. End Sub
    11. End Class

    Die Pattern musst du natürlich entsprechend anpassen ^^ Im Beispiel ists ein Kommentar // Hallo
    Mit -Imports FastColoredTextBoxNS- ist ja die .dll Datei gemeint.
    Deshalb habe ich eine neue Klasse geöffnet und den Text dort hinein kopiert.
    Aber mein Programm zeigt an, dass die .dll 102 Fehler hat. -ungültiges Zeichen- -Syntaxfehler-
    Wie kommt das?
    ?(
    Das hatte ich auch schon versucht aber:
    FastColoredTextBoxNS-Der in Imports "FastColoredTextBoxNS" angegebene Namespace oder Typ enthält keine öffentlichen Member oder kann nicht gefunden werden. Stellen Sie sicher, dass der Namespace oder der Typ definiert ist und mindestens einen öffentlichen Member enthält und dass der importierte Elementname keine weiteren Aliase enthält.
    (deshalb dachte ich das ich die .dll Datei einfügen muss,oder geht das anders?)

    Style-Der Typ "Style" ist nicht definiert.

    TextChangedEventArgs-Der Typ "TextChangedEventArgs" ist nicht definiert.

    Spoiler anzeigen
    Imports System.Text.RegularExpressions
    Imports FastColoredTextBoxNSPublic
    Class Form1
    Private GreenStyle As Style = New TextStyle(Brushes.Green, Nothing, FontStyle.Italic)
    Private Sub FastColoredTextBox1_Load(ByVal sender As System.Object, ByVal e As TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged
    'clear style of changed range
    e.ChangedRange.ClearStyle(GreenStyle)
    'comment highlighting
    e.ChangedRange.SetStyle(GreenStyle, "//.*$", RegexOptions.Multiline)
    End Sub
    End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „chke93“ ()

    Hallo,
    Es soll jetzt der Befehl -F100- in grün sein. Also habe ich folgenden Code genommen:
    e.ChangedRange.SetStyle(GreenStyle, "F.*?")

    Jetzt ist aber nur das F und die 1 grün, danach ist wieder die normale Schriftfarbe drin.
    Die Befehle sollen bis zur nächsten Leerzeile gefärbt sein.
    Es gibt aber lange und kurze Befehle z.B. F25 oder F2000.

    VB.NET-Quellcode

    1. Private GreenStyle As Style = New TextStyle(Brushes.Green, Nothing, FontStyle.Italic)
    2. Private Sub FastColoredTextBox1_TextChanged(sender As Object, e As FastColoredTextBoxNS.TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged
    3. e.ChangedRange.ClearStyle(GreenStyle)
    4. 'comment highlighting
    5. e.ChangedRange.SetStyle(GreenStyle, "F[0-9]*?\s", RegexOptions.Multiline)
    6. End Sub

    Probier mal das
    Das Funktioniert zwar ist optisch aber nicht so schön, weil sich das F... erst nach dem betätigen der Spacetaste färbt.
    Ich hab das Jetzt so gemacht:

    VB.NET-Quellcode

    1. e.ChangedRange.SetStyle(GreenStyle, "([F])") e.ChangedRange.SetStyle(GreenStyle, "([F][0-9])") e.ChangedRange.SetStyle(GreenStyle, "([F][0-9][0-9])") e.ChangedRange.SetStyle(GreenStyle, "([F][0-9][0-9][0-9])") e.ChangedRange.SetStyle(GreenStyle, "([F][0-9][0-9][0-9][0-9])")


    Da wird der Buchstabe F und die nächsten Zahlen sofort bei der Eingabe grün.