Autor Beitrag
Noobie93
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 08.07.14 15:14 
Hallo

Wie kann ich in der Konsole einen Text von rechts nach links laufen lassen?
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
      public static void Do()
        {
            Dictionary<String, String[]> Chars = new Dictionary<string,string[]>();
            String[] FileNames = { "A""B""C""D" };

            foreach (String name in FileNames)
                Chars.Add(name, File.ReadAllLines("C:/Users/Noobie93/Desktop/Buchstaben/" + name + ".txt"));
            

            Console.Write("Bitte einen Namen eingeben: ");
            String NameToPrint = Console.ReadLine();
            
            List<String[]> Word = new List<string[]>();

            foreach(Char c in NameToPrint)
                Word.Add(Chars[c.ToString().ToUpper()]);

            for(int i = 0; i < Word[0].Length; i++)
            {
                String Line = "";
                for(int j = 0; j < Word.Count; j++)
                    Line += Word[j][i];
                Console.Write(Line + "\n");
            }
            Console.ReadLine();
            
        }


Lg
Noobie93
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 08.07.14 16:12 
Hallo,

Stichwort: Timer (oder Thread)

Einige Ansätze sind z.B. unter myCSharp.de - Lauftextes erzeugen zu finden.

Ansonsten schreib, wo du genau nicht weiterkommst.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 08.07.14 16:18 
Sicher, dass du das brauchst, oder ist das nur eine Spielerei nach dem Prinzip Nice to have?
Weil in der Konsole dürfte das etwas blöde zu machen sein.

Du kannst natürlich ganz stur Leerzeichen vor den Text schreiben und die immer reduzieren, wenn ein weiteres Zeichen von Rechts dazu kommt.
Eine andere Möglichkeit ist, das du den Curser selber setzt. Schau dir dazu mal die Properties CursorLeft, CursorTop und die Methode SetCurdsorPosition an.
Eine bereits existierende Möglichkeit im .Net kenne ich nicht.

Dazu dann noch (wie Th69 schon schrieb) ein Timer, wobei ich in der Konsole eher sowas eher nicht nutzen würde, da ich mir vorstellen kann, dass es nur zu problemen kommt, wenn aus zwei Threads in die Konsole geschrieben werden kann. Schließlich kann der User schreiben und der Thread für den Lauftext schreibt in die Konsole.
Daher denke ich, ist es besser, solange die Konsole zu blockieren.

Wenn du einen permanenten Lauftext haben möchtest, dann musst du dafür sorgen, dass der auch immer oben bleibt und nach jeder Änderung des Lauftext-Threads dwer Cursor wieder an die vorherige Position zurück gesetzt wird.


Allgemein würde ich aber sagen, dass die Konsole dafür das falsche Mittel ist, da halte ich ein grafisches Fenster für besser geeignet.
Noobie93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: So 10.08.14 15:11 
Wie muss ich folgende Zeilen in meinen Code einfügen das, dass so funktioniert wie im folgenden Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lauftext
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            string str = "Hello World";
            while (true)
            {
                Console.Clear();
                Console.WriteLine(str.Substring(i, str.Length - i) + str.Substring(0, i));
                ++i;
                if (i >= str.Length)
                    i = 0;
                System.Threading.Thread.Sleep(300);
            }
        }
    }
}


Lg
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 10.08.14 15:34 
Bau dir eine Methode, die das kann, was du willst und dafür den entsprechenden Text entgegen nimmt.
Dann schmeißt du in dem vorherigen Code alles raus, was zu den Versuchen vorher gehörte und übergibst der Methode den Text, der geschrieben werden soll.

Ich glaube aber nicht, dass dir hier jemand den Code Copy-Paste-Fertig vor geben wird.
Abgesehen davon hat der Code einen ganz entschiedenen Nachteil: Es läuft im aktuellen Thread

Das heißt, du kannst das nicht abbrechen, außer die Schleiße beendet sich selber.
Du müsstest in die Konsole aus einem anderen Thread heraus schreiben lassen und dann wird es haarig.
Wenn mehrere Threads etwas schreiben, dann musst du irgendwie sicher stellen, dass der eine Thread nicht in den Text von einem Anderen schreibt und dabei ein Chaos in der Konsole erzeugt.

Ich wiederhole daher nochmal:

Zitat:
Sicher, dass du das brauchst, oder ist das nur eine Spielerei nach dem Prinzip Nice to have?
Weil in der Konsole dürfte das etwas blöde zu machen sein.


Entweder du baust dir ein Konstrukt um die Konsole herum, die dafür sorgt, das verschiedene Threads unabhängig und sicher nebeneinander und geordnet in die Konsole schreiben können, oder du baust eine grafische Oberfläche und setzt dort die Laufschrift sauber um.

Wenn es nur um die Aufgabe an sich geht, einen Lauftext anzuzeigen, dann schau dir den Timer an.
der wird im verlinkten Thread auch erwähnt und online gibt es genug Hilfen dazu.
Noobie93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 11.08.14 15:19 
Leider brauch ich das
und das Problem ist die Art wie der Buchstabe aussehen soll. Nämlich so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
 ****** 
 **  ** 
 **  ** 
 ****** 
 **  ** 
 **  ** 
 **  **

Dann sind 7 Zeilen gleichzeitig zu verschieben.
Sätze und so sind ja einfach zu verschieben aber das nicht.
Lg

Moderiert von user profile iconTh69: Code-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 11.08.14 15:39 
Ob nun 1 Zeile oder 7 Zeilen, das sollte doch egal sein :?:
Natürlich gibt es dabei einen kleinen Ruckeleffekt, da die Zeilen (auf der Konsole) nun mal nacheinander ausgegeben werden, aber die Konsole ist ja auch für solche Spielereien eigentlich nicht gedacht.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 11.08.14 15:41 
Zitat:
Dann sind 7 Zeilen gleichzeitig zu verschieben.
Sätze und so sind ja einfach zu verschieben aber das nicht.


Ob Sätze jetzt aus Wörtern oder Sternchen bestehen ist doch vollkommen egal. Das was du da hast sind einfach sieben Sätze. Wenn du einen verschieben kannst kriegst du das auch mit sieben hin.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 11.08.14 18:20 
Ich hab mir eine kleine Methode geschrieben, die das tut, in beide Richtungen dreht und flexibel mit der Länge dre Zeile um geht.

Der eigentliche Trick:

Nimm ne Liste, hol das Letzte Element, lösche das letzte Element aus der Liste und füge es an Position 0 ein.
Wenn die Items die Zeichen sind, dann ist eine Liste eine Zeile.
Umdrehen ist auch ganz einfach. Holst du einfach das erste Zeichen raus und hängst es ans Ende an.
Die LINQ-Methoden First und Last, sowie die List-Methode Insert und Add, mehr brauchts nicht.

Flexibel mit der Länge der Zeile:
Ob nun ein "Hallo Welt!" über eine 50 Zeichen lange Zeile huscht, oder über eine nur 11 Zeichen lange Zeile, das ist ja egal.
Ich schreib einfach den Text an Zeichen für Zeichen in die Liste und hänge ein paar Leerzeichen an.


Das ist nicht schwer und wenn du die Länge x der Zeile kennst, dann weißt du auch, dass es x verschiedene Zeichen-Stellungen gibt.
Du kannst dir also mit dem obigen Verfahren und x Durchläufen die x Zeilen holen und fest in die Liste ablegen. Das für jede Text-Zeile.
Dann weißt du auf jedenfall sicher, dass nur noch die Konsole das Geschwindigkeits-Limit für die Ausgabe vorgibt.


PS:

Habs grad ausprobiert.
Es hackt nix, es funktioniert wunderbar, auch wenn ich nur noch 10 mspro Schleifendurchlauf warte.