Jetzt hast du teile vom Code in Funktionen ausgelagert, deine komische Schleifenkonstruktion bleibt aber immer noch. Es ging mir darum, dass du die drei Schritte verstehst aus welchen das ganze besteht.
Schritt1:
Erkenne, dass die Maus geklickt wurde. Das ist genau der Moment, in welchem du die Maustaste runter drückst. Nun prüfst du ob sich die Maus über einem Objekt befindet welches mal mit d&d bewegen kann. Wenn ja speicher die Daten die du für den Vorgang benötigst und teile deinem Programm irgendwie mit, dass du im Drag&Drop Zustand bist.
Schritt2:
Wenn du im Drag&Drop Zustand bist, dann bewege dein Objekt. Entweder heftest du es direkt an die Maus oder verschiebst es um die letzte Mausverschiebung.
Schritt3:
Wenn die Maustaste losgelassen wird, dann prüfe ob du dein Objekt ablegen kannst/darfst. Wenn nein, dann setz es an die Ausgangsposition zurück, wenn ja, tu was nötig ist um das Objekt abzulegen und teile deinem Programm mit, dass es nun nicht mehr im Drag&Drop Zustand bist.
Das sind die drei Phasen die du bei einem Drag&Drop Vorgang normalerweise hast. Dein Code ist mir zu unübersichtlich und so wirklich verstehen was du da tun möchtest tu ich auch nicht. Versuch mal ein wenig von deiner Schleifenkonstruktion Abstand zu nehmen. Schritt 1 ist etwas was nur beim Klick der Maus eingeleitet wird. Hier holst du dir jetzt schon alle Informationen. Dazu gehört auch das Objekt welches du bewegen willst. Schritt2 bewegt nur das Objekt, tut dies aber auch nur, wenn du im d&d Zustand bist. Schritt3 wird nur ausgeführt wenn du im d&d Zustand warst und die Maus wieder los lässt.
Durch ordentliche Übersicht vereinfachst du die Fehlersuche. Der Debugger kann dir auch gut helfen. Setz mal Haltepunkte und guck was in deinen Phasen wirklich genau passiert und warum wie verschoben wird.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“