Label Text Buchstabe für Buchstabe anzeigen

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Xylon.

    Label Text Buchstabe für Buchstabe anzeigen

    Hallo alle zusammen. Ich hätte mal wieder eine kurze Frage. Ist es möglich in einem Label anstatt sofort den ganzen Text auszugeben, den Text Buchstabe für Buchstabe anzeigen zu lassen? Also wenn der Text z.B. Hallo Welt ist dann in einem bestimmten Zeitabstand(Mit Timer oder so) Buchstabe für Buchstabe ausgeben zu lassen? Oder muss ich mir da selbst eine Funktion basteln?

    Grüße,
    Hallo, dafür musst du dselbst etwas schreiben. Entweder mit dem von dir genannten Timer oder über eine Schleife, die nach und nach die Buchstaben hinzufügt. Beides läuft letzten Endes in einem eigenen Thread, weswegen du mithilfe von Invoke auf die Controls zugreife musst.
    @Xylon
    Hier,

    VB.NET-Quellcode

    1. Private WithEvents Timer1 As New Timer With {.Interval = 50, .Enabled = True}
    2. Dim i, k As Integer
    3. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    4. Dim s As String = "Hallo Welt!"
    5. If k = 3 Then
    6. i = i + 1
    7. k = 0
    8. End If
    9. k = k + 1
    10. If i > s.Length Then
    11. Timer1.Enabled = False
    12. Label1.Text = s
    13. Exit Sub
    14. End If
    15. Label1.Text = Mid(s, 1, i)
    16. End Sub


    Funktioniert...

    Mfg.enikin1998
    @enIking1998
    Bitte benutze aktuelle Funktionen, außerdem: Wo ist die Logik bei deinem Code ?(.
    Ich habe auch mal was gebastelt:

    VB.NET-Quellcode

    1. Public Sub WriteTextCharWise(input As String, interval As Double, label As Label)
    2. Dim WriteTimer As New System.Timers.Timer(interval)
    3. Dim Chars() As Char = input.ToCharArray
    4. AddHandler WriteTimer.Elapsed, Sub() If Not label.Text.Length = Chars.Length Then _
    5. Me.Invoke(Sub() label.Text &= Chars(label.Text.Length).ToString) _
    6. Else WriteTimer.Stop()
    7. label.Text = ""
    8. WriteTimer.Start()
    9. End Sub

    Aufruf geht dann folgendermaßen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. WriteTextCharWise("Hallo Welt!", 10, Label1)
    3. End Sub
    @nafets3646
    ^
    |

    Ich seh darin kein Problem...lol...

    Wenn der TE meint, eine Funktion zu gebrauchen, und mit meinem Code dieses zu erreichen ist... na dann
    wird es Ihm wohl nützlich sein, denn es funktioniert...

    Mfg.eniking1998
    @nafets3646
    Hä?!
    Das ist doch ein Scherz...

    Soll ich jetzt einem Mod, bzw Nutzer PN schreiben, den Code senden und auf ein Rückruf warten?
    So niveaulos ist doch keiner...

    Sei's "unsauber", funktionieren tut's...

    Der Klügere gibt nach ( ; ...
    Also ist das Thema erledigt...

    Mfg.eniking1998

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

    Xylon schrieb:

    mit "unsauberen" Codes hab ich überhaupt kein Problem
    Doch, das hast du, du weißt es nur nicht. Und das ist auch das Hauptproblem an dem Problem ;)
    Als Anfänger lernst du, was man dir vorsetzt, und wenn man dir Dreck vorsetzt, dann lernst du Dreck. Wenn der Dreck auch noch irgendwie funktioniert, ists sogar am schlimmsten, dann denkst du nämlich, es müsse so, und damit ist komplett ausgeschlossen, dass dus jemals richtig lernst.

    wobei ich @enIking1998:s Code gar nicht soo schlimm finde, man fragt sich halt, wasserda mit i und k macht, aber das ist so komisch, das wird auch ein Anfänger nicht im weiteren reproduzieren.
    Naja, und dann verwendet er die Mid-Funktion, dassis tatsächlich etwas, was man lassen sollte, weil für String-Verarbeitung gibts besseres, nämlich String.Substring()

    Aber guggemol böse Funktionen und böse Funktionen vermeiden, wenn du das umsetzt, dann hast du aus diesem Thread viel viel mehr gelernt, als du dir vorstellen konntest.
    So finde ich es ganz schön.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim t As New Threading.Thread(Sub() Write("Hallo das ist ein Test"))
    4. t.Start()
    5. End Sub
    6. Public Sub Write(ByVal Text As String)
    7. Me.Invoke(Sub() Label1.Text = "")
    8. For Each t As String In Text
    9. Dim c As Char = Char.Parse(t) 'Wegen dem Lambada Zeug
    10. Me.Invoke(Sub() Label1.Text &= c)
    11. System.Threading.Thread.Sleep(100)
    12. Next
    13. End Sub
    14. End Class

    nafets3646 schrieb:

    Dann frag doch mal ErfinderDesRades, RodFromGermany, Artentus, ~blaze~, ... was sie dazu sagen.

    @enIking1998

    Wo ich das hier gerade schon lese: :)
    Die Tatsache, dass ein Code funktioniert, bedeutet noch lange nicht, dass man ihn verwenden sollte. Man sollte wenn möglich immer die offensichtlichste Lösung wählen, vor allem wenn man etwas in diesem Forum postet. Denn du musst bedenken, wir kennen deinen Gedankengang nicht und müssen den Code also erst mal gründlich durchlesen, um ihn zu verstehen. Und da ist es bei einem Anfänger noch doppelt wichtig, dass der Code gut lesbar und leicht zu verstehen ist.

    @nafets3646
    Ach, und ich weiß es übrigens zu schätzen, dass du mich schon in einer Liga mit den anderen dreien siehst, auch wenn ich das selbst nicht von mir behaupten würde. :) 8-)
    @Artentus: Naja du hast mir aber auch schon echt sehr geholfen!!
    @nafets3646: Kann es sein das in dieser Zeile ein Fehler ist?

    VB.NET-Quellcode

    1. Me.Invoke(Sub() label.Text &= Chars(label.Text.Length).ToString) _

    Wenn ich zu schnell hintereinander auf den Button klicke stürzt das Programm ab und sagt mir das der Index außerhalb des arrays war. Aber das kann doch garnicht sein, oder?
    Das kommt daher, dass du bei jedem Klick einen neuen Timer startest. Mehrere Timer, die aufs gleiche Objekt zugreifen, können sich gegenseitig in die Quere kommen. Du solltest also irgendwie prüfen, ob gerade noch ein alter Timer läuft, bevor du einen neuen startest.