Label Wandern lassen ohne Timer



  • Hallo,

    Ich habe mal wieder ein Problem mit einer Aufgabe.

    Die Aufgabe lautet:

    Erstellen Sie ein Progamm,in dem ein label mit beliebigen Inhalt nach dem Anklicken einer Schaltfläche von oben nach unten "wandert".
    Die Wanderung soll von den Koordinaten 0 bis 300 gehen und mindestens 10 mal wiederholt werden. Die Wiederholung sollen beim Anklicken der Schaltfläche automatisch gestartet werden und "Pro Schritt" nur um ein Pixel nach unten verschoben werden.

    Ich habe mir folgenden Code überlegt nur klappt er nicht so ganz 😞

    namespace Aufgabe_4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Close();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                int AktuellePositionY=label1.Location.Y;
                int AktuellePositionX=label1.Location.X;
    
                for (int Y = 0; Y < 300; Y++)
                    label1.Top++;
    

    Nun meine Frage:

    Wenn ich auf den Button klick Spring das label sofort auf die endmarke
    wie kann ich das am besten lösen hatt iegendwer einen Tipp für mich Bitte;



  • Wieso ohne Timer?

    Ansonsten: du musst nach der Modifikation der Koordinaten noch irgendwie veranlassen dass alles neu gezeichnet wird - z.B. indem du Refresh aufrufst. Und dann noch irgendwie ein Delay erzeugen ( Thread.Sleep ?), damit man auch Zeit hat alle Zwischenschritte zu sehen.

    Ist aber die unsaubere Lösung, also nochmal die Frage: wieso ohne Timer?



  • Hallo,

    erstmal vielen Dank für deine schnelle Antwort.

    Auf deine Frage hin wieso ohne Timer.

    Ich bin in einen studium und muss gewissen aufgaben lösen so wie diese hier und in der aufgaben beschreibung steht nix drin ob mit oder ohne Timer, bzw haben wir noch nicht mit einem Timer gearbeitet.

    Also so wie es jetz ist, läuft es mann sieht wie sich das label bewegt von Top.0 nach Top.300, es wiederholt sich auch 10 mal.

    Nur wie Du schon sagtest es ist sehr "schnell" und mann kann es nur schwer verfolgen.



  • Wie Hustbear schon sagte!

    Bei jedem "label1.Top++" müsste du kurz warten (bspw. Thread.Sleep), da dein CPU so schnell ist, dass er die schleife so schnell abgeabeitet hat, dass man die bewegung nich sieht!

    sowas wie: (ungetestet)

    ThreadPool.QueueUserWorkItem((obj) =>
    {
      for (int Y = 0; Y < 300; Y++)
      {
        label1.Invoke((MethodInvoker)delegate {  label1.Top++;});
        Thread.Sleep(10);
      }
    });
    


  • jonnywhite7 schrieb:

    Ich bin in einen studium und muss gewissen aufgaben lösen so wie diese hier und in der aufgaben beschreibung steht nix drin ob mit oder ohne Timer, bzw haben wir noch nicht mit einem Timer gearbeitet.

    Vielleicht sollte man den Prof mal hinterfragen, wozu diese Aufgabe gut sein soll...
    Ich sehe bei der Aufgabenstellung erstens keinen vernünftigen Nutzen des 'Programms' und zweitens auch kein Lernziel...



  • Mag sein, dass die Aufgabe einen nur schwer erkennbaren Sinn hat. Hier eine immerhin lauffähige Lösung:

    public partial class Form1 : Form
        {
            public Point pStart;
            public Form1()
            {
                InitializeComponent();
                pStart = label1.Location;
                label1.Text = "Wandernder Label";
                button1.Text = "Start";
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Point p = new Point();
                button1.Enabled = false;
                p.X = pStart.X;
                p.Y = pStart.Y;
                for (int i = 0; i < 300; i++)
                {
                    Thread.Sleep(5);
                    p.Y++;
                    label1.Location = p;
                }
                p.Y = pStart.Y;
                label1.Location = p;
                label1.Text = "fertig";
                button1.Enabled = true;
            }
        }
    


  • vielen Dank für eure Hilfe.

    Die tipps von euch haben mir sehr geholfen.

    nochmals Danke an alle. 👍 👍 👍 👍


Anmelden zum Antworten