Hallo Felix,
deinem Quelltext entnehme ich folgendes:
- Mit dem Button btnAdd erzeugst du TShapes auf dem Formular und legst eine Referenz auf die Shapes im Feld DeskArray ab.
- Die Anzahl der erzeugten Shapes merkst du dir im Tag-Feld des Buttons.
- Zum Verschieben benutzt du die Drag&Drop-Funktion von Delphi.
Zum Fehler: nach dem Erzeugen eines Shapes erhöhst du die Anzahl im Feld
btnAdd.Tag. Wenn du ein Shape verschiebst, wird am Ende die Routine
DeskEndDrag aufgerufen. Diese greift
mit dem bereits erhöhten Zähler auf ein Feldelement zu, in dem möglicherweise noch gar kein gültiger Zeiger steht!
Das Verschieben über Drag&Drop ist vielleicht der falsche Ansatz. Der Benutzer hat ja während des Vorgangs keine Kontrolle darüber, wo das Shape abgelegt wird.
Ein Vorschlag:
- Benutze die Events OnMouseDown, OnMouseMove und OnMouseUp von TShape.
- Bei OnMouseDown merkst du dir die übergebenen Koordinaten als relative Position des Mauszeigers im Shape. Zusätzlich merkst du dir in einer globalen Variablen, daß der Verschiebevorgang gestartet wurde.
- Bei OnMouseMove prüfst du zunächst, ob gerade ein Shape verschoben wird (die globale Variable...). Falls ja, änderst du die Koordinaten des aktiven Shapes (Parameter Sender). Die Änderung für Left und Top kannst du aus der gemerkten relativen Position und den übergebenen Koordinaten X und Y errechnen.
- Bei OnMouseUp setzt du die globale Variable zurück, weil das Verschieben beendet ist.
Falls du diesem Vorschlag folgen möchtest, solltest du das Setzen von
DragMode aus deinem Code entfernen.
Gruß Hawkeye