Mir fallen dazu folgende Möglichkeiten ein:
1) Wenn deine Drop-Prozedur nur von Shapes benutzt wird, deren Name die Form 'ShapeXX' hat, dann kannst du XX als Integer folgendermaßen erhalten (wobei i eine Integer-Variable ist):
i := StrToInt(Copy((Sender as TShape).Name, 6, 2));
Dieser Code nimmt an, dass der Sender ein TShape (oder Nachkomme davon) ist und wandelt die Zeichen 6 und 7 des Namens in einen Integer um.
2) Stattdessen könntest du auch gleich das "Tag"-Feld benutzen, das jede Komponenteninstanz zur freien Verfügung bereitstellt. Mit dem Objektinspektor kannst du für jede deiner Shapes den Tag setzen, auf 1 für Shape01, auf 2 für Shape02 usw.
Deine Drop-Prozedur kann die Werte dann so ganz einfach auslesen:
i := (Sender as TShape).Tag;
Wenn es dir zu mühselig ist, alle Tags mit dem Objektinspektor zu setzen (bei >20 Shapes durchaus verständlich), kannst du die Tags auch durch folgenden Code setzen lassen, der beispielsweise in FormCreate platziert wird:
Delphi-Quellcode:
var
i: Integer;
c: TComponent;
//...
i := 1;
repeat
c := FindComponent(Format('Shape%.2d', [i]));
if c is TShape then
TShape(c).Tag := i;
Inc(i);
until c = nil;
Egal ob du Methode 1) oder 2) benutzt, wenn du erst mal deine Shapes "zu Integer konvertiert" hast, dann lassen sich deine if-Abfragen einfach gestalten:
if (i >= 1) and (i <= 10) then // if (Sender = Shape01 ... 10) then
Ich hoffe das hilft dir weiter.