Me.Text.length liefert falsches Ergebniss

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von LuaX.

    Me.Text.length liefert falsches Ergebniss

    Schönen guten Taaaaaaaag,
    Ich arbeite zurzeit an einer "art" Textbox und mir ist da was aufgefallen.
    Der Code

    VB.NET-Quellcode

    1. Me.Text = Me.Text.Substring(0, Me.Text.Length - 1)
    2. Invalidate()


    funktioniert irgendwie nicht, nachdem ich mir Me.Text.Length mal anzeigen lassen habe, habe ich gemerkt,
    das Me.Text.Length immer zurückgibt, wie lang der String mal war (also wenn es mal 100 Zeichen waren gibt
    es 100 zurück)

    Ja gut, ist das ein Bug oder mache ich etwas flasch?

    Der gasammte Code nochmal:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class BetterTextArea
    2. Inherits Control
    3. Sub New()
    4. MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    5. MyBase.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    6. MyBase.SetStyle(ControlStyles.UserMouse, True)
    7. MyBase.SetStyle(ControlStyles.UserPaint, True)
    8. MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
    9. End Sub
    10. Private Sub PaintEvent(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    11. DrawRoundedRectangle(e.Graphics, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1), 6, Color.Black)
    12. Dim pos As New Point(Me.Height / 2, Me.Width / 2)
    13. Dim font As New Font("Segoe Print", 20, FontStyle.Regular, GraphicsUnit.Pixel)
    14. Dim size = e.Graphics.MeasureString(Text, font)
    15. Dim texPos As New Point(0, (Me.Height - size.Height) / 2)
    16. If (size.Width > Me.Size.Width) Then
    17. texPos.X -= size.Width - Me.Size.Width
    18. End If
    19. e.Graphics.DrawString(Me.Text, font, Brushes.Black, texPos)
    20. End Sub
    21. Private Sub BetterTextArea_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    22. If e.KeyCode = Keys.V And e.Control Then
    23. If isCopyPasteAllowed Then
    24. Me.Text += Clipboard.GetText
    25. Invalidate()
    26. Else
    27. With New Audio
    28. .PlaySystemSound(Media.SystemSounds.Exclamation)
    29. End With
    30. End If
    31. ElseIf e.KeyCode = Keys.Back Then
    32. If e.Control Then
    33. Me.Text = ""
    34. Invalidate()
    35. ElseIf Me.Text.Length > 0 Then
    36. Console.WriteLine(Me.Text.Length)
    37. Me.Text = Me.Text.Substring(0, Me.Text.Length - 1)
    38. Invalidate()
    39. End If
    40. End If
    41. End Sub
    42. Private Sub BetterTextArea_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
    43. Dim kb As New Keyboard
    44. If Not kb.CtrlKeyDown Then
    45. Dim c = e.KeyChar
    46. Me.Text &= c
    47. Invalidate()
    48. End If
    49. End Sub
    50. Private isCopyPasteAllowed As Boolean = True
    51. <Category("Behavior")>
    52. Public Property CopyPasteAllowed() As Boolean
    53. Get
    54. Return isCopyPasteAllowed
    55. End Get
    56. Set(ByVal value As Boolean)
    57. isCopyPasteAllowed = value
    58. End Set
    59. End Property
    60. End Class



    EDIT:
    Wen ich ALT drücke funktioniert es komischerweise....


    Grußartige grüße, Luca
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.

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

    LuaX schrieb:

    (also wenn es mal 100 Zeichen waren gibt es 100 zurück)
    :?: :?: :?:
    Ich kann Deinen Effekt leider nicht reproduzieren. Kannst Du da mal ein Beispiel für posten?
    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!
    Hey @RodFromGermany

    falls du mit beispiel quellcode meinst, oben habe ich den gesamten Code des Steuerelements im Spoiler

    Hier nochmal der Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class BetterTextArea
    2. Inherits Control
    3. Sub New()
    4. MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    5. MyBase.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    6. MyBase.SetStyle(ControlStyles.UserMouse, True)
    7. MyBase.SetStyle(ControlStyles.UserPaint, True)
    8. MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
    9. End Sub
    10. Private Sub PaintEvent(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    11. DrawRoundedRectangle(e.Graphics, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1), 6, Color.Black)
    12. Dim pos As New Point(Me.Height / 2, Me.Width / 2)
    13. Dim font As New Font("Segoe Print", 20, FontStyle.Regular, GraphicsUnit.Pixel)
    14. Dim size = e.Graphics.MeasureString(Text, font)
    15. Dim texPos As New Point(0, (Me.Height - size.Height) / 2)
    16. If (size.Width > Me.Size.Width) Then
    17. texPos.X -= size.Width - Me.Size.Width
    18. End If
    19. e.Graphics.DrawString(Me.Text, font, Brushes.Black, texPos)
    20. End Sub
    21. Private Sub BetterTextArea_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    22. If e.KeyCode = Keys.V And e.Control Then
    23. If isCopyPasteAllowed Then
    24. Me.Text += Clipboard.GetText
    25. Invalidate()
    26. Else
    27. With New Audio
    28. .PlaySystemSound(Media.SystemSounds.Exclamation)
    29. End With
    30. End If
    31. ElseIf e.KeyCode = Keys.Back Then
    32. If e.Control Then
    33. Me.Text = ""
    34. Invalidate()
    35. ElseIf Me.Text.Length > 0 Then
    36. Console.WriteLine(Me.Text.Length)
    37. Me.Text = Me.Text.Substring(0, Me.Text.Length - 1)
    38. Invalidate()
    39. End If
    40. End If
    41. End Sub
    42. Private Sub BetterTextArea_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
    43. Dim kb As New Keyboard
    44. If Not kb.CtrlKeyDown Then
    45. Dim c = e.KeyChar
    46. Me.Text &= c
    47. Invalidate()
    48. End If
    49. End Sub
    50. Private isCopyPasteAllowed As Boolean = True
    51. <Category("Behavior")>
    52. Public Property CopyPasteAllowed() As Boolean
    53. Get
    54. Return isCopyPasteAllowed
    55. End Get
    56. Set(ByVal value As Boolean)
    57. isCopyPasteAllowed = value
    58. End Set
    59. End Property
    60. End Class



    Ich habe aber gerade mal mit hilfe von Haltepunkten nachgeschaut,
    der Me.Text enthält einfach den Text und ein paar vbBack's was wohl der Grund dafür sein wird.

    Hat jemand eine Idee wie das zu beheben ist?

    Ich verwende VB.NET 4.5 mit VisualStudio 17 RC

    Grüße, Luca
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
    @LuaX Fang an mit Option Strict On.
    Da fehlt noch einiges an Verweisen und Include.
    Was?
    =======================
    2 Haltepunkte:
    • einen auf Zeile Me.Text = Me.Text.Substring(0, Me.Text.Length - 1) (BetterTextArea_KeyDown)
    • einen auf Zeile Me.Text &= c (BetterTextArea_KeyPress)
    Dann solltest Du den Fehler selber finden. :D
    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!

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

    Achherje, ich könnte mich gerade selber auf den Mond schießen.....
    Danke @RodFromGermany

    Naja.....ich kann das Event ja nicht zweimal abfangen und einmal was weg und dann wieder dazumachen....
    Man bin ich blöd


    Würg,

    Grüße Luca
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.