Text Schreiben lassen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.
-
-
-
-
bzw
oder
msdn.microsoft.com/de-de/libra…indows.forms.textbox.aspx
oder wie Mr VB das mit einer Schleife lösen. -
-
das Thema gabs neulich schon. also die Lösung ist, dass man mit einem Timer bei jedem Tick immer einen Buchstaben anhängt. Textbox.AppendText.
alles annere ohne Timer ist Murx, weil prozedural gedacht, wo eventbasiert programmiert werden muß.
Achja - im anneren Thread hatte auch Picoflop mir zurecht wiedersprochen: mit dem neuen CTP-Async kann man sowas tatsächlich auch "scheinbar" prozedural implementieren. -
ErfinderDesRades schrieb:
alles annere ohne Timer ist Murx, weil prozedural gedacht, wo eventbasiert programmiert werden muß.
... und ich dachte das Zeitalter des Absolutismus wäre 1789 zu Ende gegangen -
-
[VB.NET] Text in Zeichen zerlegen
[VB 2008] Schreibmaschine
[VB 2008] Console text als Schreibmaschine -
Kangaroo schrieb:
... und ich dachte das Zeitalter des Absolutismus wäre 1789 zu Ende gegangen
Jedenfalls im technischen Bereich, und die Programmier-Wissenschaft ist ein solcher.
Natürlich steht jedem frei, anders als eventorientiert vorzugehen - tatsächlich ist das der einzige Weg, meine Aussage "das ist Murx" annähernd zu verifizieren.
Falsifizieren werdet ihr sie nicht können, oder ich wäre euch sehr dankbar, denn dann habt ihr meinen Horizont erweitert.
Also bitte! Probiert einfach die bisher gegebenen Vorschläge auch mal aus, dann seht ihrs ja.
Die einzig bisher mir bekannte Falsifikation ist die von Picoflop angeführte, und die setzt halt die Installation des CTP-Async-Frameworks voraus. -
-
Im April hab ich das noch so gemacht:
Spoiler anzeigen VB.NET-Quellcode
- Public Class Form1
- Dim MeinText As String
- Dim Zeichen As Integer
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- MeinText = " Hier kommt die Maus... "
- Zeichen = 0
- Timer1.Interval = 250
- Timer1.Start()
- End Sub
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- TextBox1.Text &= MeinText.Substring(Zeichen, 1)
- Zeichen += 1
- If Zeichen = MeinText.Length - 1 Then
- TextBox1.Clear()
- Zeichen = 0
- End If
- End Sub
- End Class
Das mir da was blockiert würde, sehe ich jetzt net. -
nana. also mindestens Kangaroo kennt sich glaub wirklich gut aus.
Ich geh ihm blos immer auf die Nerven mit meine apodiktische Art, daherzureden. Aber wenn etwas Fakt ist, dann sagichauch, es ist Fakt.
Ich denk mir die Fakts ja nicht aus, daher hinkt der Vergleich mittm Absolutismus. -
Unwesen schrieb:
Das mir da was blockiert würde, sehe ich jetzt net
Forms.Timer arbeiten auf dem GUI-Thread: wenn also dort eine zeitintensive Verarbeitung stattfindet, wíird die Ausgabe "lagged".
Insofern ist also der Vorschlag von ErfinderDesRades genauso ein 'Murx'-Kompromiss.
ErfinderDesRades schrieb:
Ich geh ihm blos immer auf die Nerven mit meine apodiktische Art, daherzureden.
Stimmt, aber was wäre das Leben ohne Herausforderungen
Nein, nun im Ernst: jeder möge die Lösung nehmen, die ihm unter Berücksichtigung der o.a. Punkte zusagt. Es gibt wirklich Pro und Contra ... -
Forms.Timer arbeiten auf dem GUI-Thread: wenn also dort eine zeitintensive Verarbeitung stattfindet, wíird die Ausgabe "lagged".
ich weiß jetzt auch nicht, welche vorschläge noch diskutiert werden. Diskutieren wir jetzt die Vorzüge verschiedener Timer? Dann bin ich ja auf jeden Fall zufrieden, das ist ja eventorientiert gedacht.
Ansonsten scheints mir schnurz, ob der eine Timer um 5ms genauer geht als der annere. Das wird der User wohl kaum wahrnehmen können.
also plädiere ich für den am einfachsten anzuwendenden: den Winforms-Timer. -
Na, das ist ja ein lustiger Thread
Fangen wir mal damit an, dass mein zuerst geposteter Code schlechte Programmierpraxis war, da er den GUI-Thread lahmlegte: -> no discussion, Asche auf mein Haupt.
Das eigentliche Reizthema für mich ist dagegen dieser ganze dogmatische Dummfug , alles ohne Timer sei Murx da nicht eventbasierend (auf das Geschwurbel über Gesetze der Logik und Naturgesetze gehe ich lieber nicht ein).
Auch in .NET gilt: was per se prozedural ist, darf auch prozedural programmiert werden und muss nicht dogmatisch in eine eventorientierte Zwangsjacke gesteckt werden. Und Timer lösen zwar Events aus, sind im Hintergrund jedoch nix anderes als Threads aus dem Threadpool die permanent im Kreis laufen um alle paar Millisekunden regelmässig 'Piep' zu sagen. Bis sie dann irgendwann von diesem schrecklichen Schicksal erlöst werden ...
Jedenfalls ist das buchstabenweise Ausgeben eines Strings für mich von der Problemstellung her prozedural, darf also auchso gelöst werden, z.B. in einer Schleife die nach jeder Ausgabe eine Pause macht. Solange das in einem eigenem Thread geschieht, ist das absolut ok, immer noch prozedural, und auch nix anderes als der Timer eh macht.
Themawechsel: warum jetzt keine Forms-Timer ? Diese Art optischen Firlefanz findet man z.B. oft in Splashscreens , die zu Anfang eines Programms Designfehler beim Laden des Programms überdecken oder (unerwünschte) Informationen über den Verfasser und sein unglückliches Programm geben sollen. Dort ist der arme GUI-Thread eh überlastet, so dass eine Lösung mit Forms-Timer danebengreift.
Insofern besser gleich asyncron, wie: System.Timer / Thread / BeginInvoke ...
Der extra Aufwand den unser Erfinder moniert ist eh minimal: ob ich nun Textbox1.Text &= char schreibe oder Textbox1.Invoke(Sub() txtBox.Text &= char) ist ja wohl ziemlich egal.
Als Buße für meinen schlechten Code jetzt einen asynchronen:
Spoiler anzeigen
VB.NET-Quellcode
- Class FancyTextbox
- ' Buchstabenweise Ausgabe eines strings in der Textbox
- Public Shared Sub SlowText(ByVal txtBox As TextBox, ByVal text As String, ByVal updateInterval As Integer)
- Dim t As Thread = New Thread(Sub() updateTextBox(txtBox, text, 100)) With {.IsBackground = True, .Priority = ThreadPriority.Lowest}
- t.Start()
- End Sub
- ' update thread
- Private Shared Sub updateTextBox(ByVal tBox As TextBox, ByVal s As String, ByVal updateInterval As Integer)
- For Each c As Char In s
- Dim cl As Char = c ' good practice not to use iteration var in lambda expression
- tBox.Invoke(Sub() tBox.Text &= cl)
- Threading.Thread.Sleep(updateInterval)
- Next
- End Sub
- End Class
-
Gratulation! Du hast meinen Horizont erweitert!
So isses tatsächlich prozedural geproggt ohne Murx -
ach, ich stell auchmal die eventbasierte Lösung vor:
VB.NET-Quellcode
- Public Class Form2
- Private _ToWrite As Queue(Of Char)
- Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
- _ToWrite = New Queue(Of Char)("Hallo Welt")
- Timer1.Start()
- End Sub
- Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
- TextBox1.AppendText(_ToWrite.Dequeue)
- If _ToWrite.Count = 0 Then Timer1.Stop()
- End Sub
- End Class
-
Ähnliche Themen
-
2 Benutzer haben hier geschrieben
- Gast (12)
- ErfinderDesRades (6)