Laden...

Bewegen mehrerer Controls per Schleife und Timer

Erstellt von kotibus vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.474 Views
Thema geschlossen
K
kotibus Themenstarter:in
24 Beiträge seit 2011
vor 12 Jahren
Bewegen mehrerer Controls per Schleife und Timer

Hey,

ich habe eine Methode, die per Filter ausgeschlossene Einträge (Labels) unsichtbar macht. Nun entstehen hierdurch Lücken zwischen den einzelnen Labels, die genau Positioniert waren, um wie eine Liste untereinander zu stehen. Nun möchte ich eine allgemeine Methode schreiben, die alles richtig positioniert. Das würde so auch problemlos funktionieren... allerdings hätte ich gerne einen kleinen Effekt: die Einträge sollen innerhalb von 2.5 Sekunden in 25 Schritten an ihren Platz wandern.

Hierfür benutze ich eine Schleife, die alle Einträge durchgeht und einen Timer, der auf jedes sichtbare, aber noch nicht richtig positionierte Label einzel wirken soll. Habe jetzt über eine Stunde nach dem Fehler in meinem Code gesucht, leider erfolglos:


        private void moveVisibleEntries() {
            int counter = 0;
            for (int i = 0; i < entries.Count; i++) {
                MyLabel currentEntry = (MyLabel)entries[i];
                if (currentEntry.Visible == false)
                {
                    continue;
                }

                int wantedPosition = counter * 25;
                int currentPosition = currentEntry.Location.Y;
                if (wantedPosition == currentPosition) {
                    counter = counter + 1;
                    continue;
                }
                //currentEntry.Location = new Point(0, wantedPosition);
                
                int diffrence = currentPosition - wantedPosition;
                long movesPerStep = diffrence / 25;
                int tickCounter = 1;
                Timer movingTimer = new Timer();
                movingTimer.Interval = 100;
                movingTimer.Tick += delegate(System.Object o, System.EventArgs e)
                {
                    currentEntry.Location = new Point(0, Convert.ToInt32(currentPosition - (movesPerStep * tickCounter)));
                    tickCounter = tickCounter + 1;
                    buglog.Text += "TickCount: " + tickCounter + "\n";
                    if (tickCounter >= 25) {
                        movingTimer.Stop();
                    }
                };
                movingTimer.Start();

                counter = counter + 1;
            }
        }

Wäre sehr nett, wenn sich das mal jemand anschauen könnte.

Danke

EDIT: Im Buglog stehen danach wirre Zahlen :x (z.B. 2, 3, 4, 2, 6, ...)

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo kotibus,

du erzeugst in einer Schleife x Timer. Das ist auf jeden Fall unsinnig. Du brauchst nur einen Timer. In dessen EventHandler gehört dann die Schleife für die Controls.

herbivore

PS: Siehe auch |JuyJuka.ControlBewegung| Lustige Komponente um Controls herum gleiten zu lassen.

K
kotibus Themenstarter:in
24 Beiträge seit 2011
vor 12 Jahren

Warum ist das unsinnig? Ist doch das gleiche, nur umgekehrt. Und so erscheint es mir sinnvoller, da ja jedes Label eine andere Start- und eine andere Endposition hat. Ein Timer für alle eher von Vorteil, wenn die Controls alle die gleiche bewegung vollziehen würden, was Sie nicht tun.
Also müsste ich dem Timer hier die bereits im Vorfeld berechneten Schritte (oder zumindest Variablen für die Berechnung) übergeben... wobei ich leider keine Ahnung hab, wie ich die Paramter, die übergeben werden, ändern kann. Ich programmiere sonst nur mit asp.net und normalen ajax, rufe also alle meine Funktionen aus der Page_load Methode selbst auf. Deswegen auch der delegate, wusste einfach nicht wie ichs anders lösen soll.

Aber auch, wenn es unsinnig ist... funktionieren sollte es doch trotzdem, oder? Keine Idee warum es das nicht tut?

U
1.688 Beiträge seit 2007
vor 12 Jahren

Keine Idee warum es das nicht tut?

Was tut es denn? Leider mangelt es an einer Fehlerbeschreibung.

Dein Quelltext ist im übrigen sehr unübersichtlich und schwer zu verstehen. Ich habe auch den Eindruck, dass Du nicht weißt, was Du mit dem anonymen Delegaten anrichtest. Was denkst Du, ist die Ausgabe der folgenden Code-Zeilen:


int i=0;
Action f=()=>Console.WriteLine(i);
i=1;
Action g=()=>Console.WriteLine(i);
i=2;
f();
i=3;
g();

888 Beiträge seit 2007
vor 12 Jahren

Hier auch nochwas von mir zum Thema Controls & Timer:
FormMover

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo kotibus,

das eine ist, wo der Fehler in deinem Code ist. Dass es dabei wohl um ein Missverständnis im Zusammenhang mit Captured Variables, hat ujr aufgezeigt. Captured Variables gehören natürlich nicht zu den Grundlagen, sondern sind wirklich ein bisschen tricky. Das Thema ist allerdings "Bewegen mehrerer Controls per Schleife und Timer" und das fällt - spätestens nachdem du jetzt mehrere Hinweise bekommen hast, wie du das Problem lösen kannst - sicher unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 denn das kann man ohne Weiteres auch ohne Captured Variables lösen.

herbivore

Thema geschlossen