Label nach dem Anklicken von oben nach unten durch ein Formular wandern lassen
-
Hallo zusammen,
ich bin neu in diesem Forum und schreibe heute meine erste Anfrage. Bisher konnte mir dieses Forum sehr viel weiter helfen... heute jedoch finde ich einfach nicht die richtige Antwort
Dies ist die Aufgabe:
Ich soll ein Programm erstellen, in dem ein Label nach Anklicken einer Schaltfläche von oben nach unten durch ein Formular "wandert". Die "Wanderung" soll von den Koordinaten 0 bis 200 gehen und mindestens 20 Mal wiederholt werden. Pro "Schritt" soll das Label um eine Position nach unten verschoben werden.Diesen Code habe ich bisher:
private: System::Void buttonWandern_Click(System::Object^ sender, System::EventArgs^ e) { //die Y-Koordinate wird in einer Variablen gespeichert Int32 labelTop = labelBewegung ->Top; //mittels einer Schleife die Y-Koordinate erhöhen for (Int32 y=0; y <= 20; y++); labelTop +=10; labelBewegung ->Location = Point (0, labelTop); }
Das funktioniert so weit zwar, ab es sind alle nicht alle Bedingungen erfüllt, da das Label auch nach 21 x anklicken noch weiter läuft.
Auch fehlt irgendwie die Angabe der Koordinaten.Ich hoffe, dass Ihr mir weiterhelfen könnt und bin für jede Anregung dankbar.
Vielen Dank im Voraus
-
Sahandra schrieb:
Bisher konnte mir dieses Forum sehr viel weiter helfen... heute jedoch finde ich einfach nicht die richtige Antwort
Wenn Du richtig geguckt hättest, hättest Du gesehen, dass das Forum Dir auch heute hätte helfen können...
Guckst Du hier....
http://www.c-plusplus.net/forum/viewtopic-var-t-is-217615.html
Gruß, Doug_HH
-
Sahandra schrieb:
for (Int32 y=0; y <= 20; y++);
Wozu das Semikolon hinter der Schleife?
-
Sahandra schrieb:
for (Int32 y=0; y <= 20; y++);
Wozu das Semikolon hinter der Schleife?
Keine Ahnung! Wozu das Semikolon da steht.
Nimm doch den Code hier, da ist alles drin und dran...
In das Click-Event vom Button einfügen.Int16 labelTop = labelMove->Top; //die oberere Prosition von "labelMov" in einer Variable speichern if (labelMove->Top == 20)//wenn das Label 20 Mal bewegt wurde, eine Meldung ausgegeben. { MessageBox::Show("Das Label hat sich " + + labelMove->Top::get() + " Mal nach unten bewegt!","Es bewegt sich...",MessageBoxButtons::OK,MessageBoxIcon::Exclamation,MessageBoxDefaultButton::Button1,MessageBoxOptions::DefaultDesktopOnly); } if (labelMove->Top == 200) { MessageBox::Show("Das Label hat sich bis zur Position " + labelMove->Top::get() + " bewegt. \nDie Position wir nun wieder auf 0 gesetzt.","Und es bewegt sich nicht mehr...",MessageBoxButtons::OK,MessageBoxIcon::Exclamation,MessageBoxDefaultButton::Button1,MessageBoxOptions::DefaultDesktopOnly); //da in der nächsten Zeile die Variable "labelTop" um 1 erhöt wird, setzen wir hier einen nekativen Wert labelTop = -1; } labelTop +=1; //die Variable um eins erhöhen labelMove->Location = Point(12,labelTop); //die Wert der Variable labelMove übergeben labelMove->Text = "Top von \"labelMove\" = " + Convert::ToString(labelMove->Top);//Text im Label anzeigen
Gruß, Doug_HH
-
Hallo Doug_HH und hallo witte,
es gibt noch einen zusätzlichen Hinweis zu der Aufgabe, dass die Anweisung
label1 ->Location = Point (10,10)
ein Label an diese Position positioniert.
Jetzt hatte ich mir vorgestellt, einen Code zu erstellen, der angibt:
Springe von Point (0,0) zu Point (0,10) dann zu Point (0,20) usw.Ich könnte mir auch vorstellen, dass man nur 1x auf den Button klickt und das Label in Einzelschritten automatisch an die Position (0,200) "wandert".
Wozu das Semikolon steht???
Keine Ahnung was ich gemacht habeDas werde ich mir gleich noch einmal ansehen.
Gruß
Sandra
-
So jetzt habe ich mal den Quelltext überarbeitet und einen "Timer" ausprobiert:
private: System::Void buttonWandern_Click(System::Object^ sender, System::EventArgs^ e) { //die oberere Position in einer Variable speichern Int32 y = labelBewegung ->Top; if (labelBewegung ->Top ==20) { labelBewegung ->Top::get(); } if (labelBewegung ->Top ==200) { y =-10; } //Die Variable um 10 erhöhen y +=10; //die Werte der Variablen labelBewegung übergeben labelBewegung ->Location = Point(0,y); //Text im Label anzeigen labelBewegung->Text = "Bewegung von 0 bis " + Convert::ToString(labelBewegung->Top); }
Der Timer funktioniert in soweit, dass er nach dem Anklicken ausgeführt wird... aber nicht automatisch nach der letzten "Wanderung" endet.
Aber ich bleib am Ball - bis ich ein Ergebnis habe, mit dem ich auch zufrieden bin.
-
Setzt doch einfach Timer1->Enable = false;
if (labelBewegung->Top == 200) { y =-10; Timer1->Enable = false;//Timer ausschalten = Ende der Vorstellung...Schluß }
Gruß, Doug_HH
-
Den Timer habe ich standardmäßig auf true gesetzt.
Wenn ich, wie von Doug_HH beschrieben, den Timer beende, ist zwar "Ende der Vorstellung..." aber die "Wanderung" beginnt bevor ich überhaupt auf den Button geklickt habe.Die Lösung ist jedoch ganz einfach:
Ich starte den Timer nicht automatisch, sondern manuell und beende ihn anschließend wieder manuell.private: System::Void buttonWandern_Click(System::Object^ sender, System::EventArgs^ e) { //die oberere Position in einer Variable speichern Int32 y = labelBewegung ->Top; [b]timer1->Enabled = true;[/b] if (labelBewegung ->Top ==20) { labelBewegung ->Top::get(); } if (labelBewegung ->Top ==200) { y =-10; [b]timer1->Enabled = false;[/b] } //Die Variable um 10 erhöhen y +=10; //die Werte der Variablen labelBewegung übergeben labelBewegung ->Location = Point(0,y); //Text im Label anzeigen labelBewegung->Text = "Bewegung von 0 bis " + Convert::ToString(labelBewegung->Top); }
Ich danke Euch für die Unterstützung und sage Herzlichen Dank