Ich kann das aus Zeitgründen nicht genauer nachvollziehen, aber das hier sieht komisch aus:
Delphi-Quellcode:
R.Right := R.Left + R.Right;
R.Bottom := R.Top + R.Bottom;
R.Right und R.Bottom sind ja noch nicht richtig zugewiesen. Wolltest Du statt dessen Width und Height verwenden?
Kann das Auswirkungen auf Left und Top haben.?
besser wäre sicher so etwas:
Delphi-Quellcode:
P := Self.ScreenToClient(Control.ClientToScreen(Point(0, 0)));
R := TRect.Create(P,X, P,Y, Control.ClientRect.Width, Control.ClientRect.Height);
So fände ich das übersichtlicher.
Ansonsten schau erst mal, ob die Positionen in Bezug auf das Formular überhaupt richtig ermittelt werden.
Bei der Sortierung selbst kann ja dann nicht mehr viel schief gehen.
Dass Align öfter ermittelt wird, damit muss man bei der
VCL (und ähnlich auch bei FMX) leben.
Du kannst evtl. selbst einige Werte speichern und beim nächsten Aufruf (vor Deiner Sortierberechnung) prüfen, ob sich an den Ausgangswerten etwas geändert hat. Wenn nicht, einfach nicht neu sortieren.