Hallo Torstenheinze!
Ich muss mich nochmal selber korrigieren: Hatte einen Denkfehler. Ich habe nur die Eigenschaften Top und Left zum Vergleich genommen. Das ist natürlich falsch, da alle Komponenten, die rechts davon liegen bevorzugt wurden.
Ich habe das Problem versucht zu lösen, indem ich den Mittelpunkt aller Komponenten gebildet habe und dann die Wegstrecke verglichen habe. Das ist allerdings auch nicht immer richtig.
Um das Problem richtig zu lösen, brauchst du eine etwas aufwendigere Methode, die die Nähe jeder Kante eines Rechtecks zu einem anderen Rechtecks ausrechnet.
Da dies etwas aufwändiger ist, poste ich hier dir mal die Lösung mit den Mittelpunkten. Wenn diese nicht für dein Problem reicht, dann versuch ich dir die andere Methode zu schreiben, wobei ich gerade nicht wirklich weiss, wie diese Funktionieren soll. So hier der Quelltext:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.Button2Click(Sender: TObject); var I: Integer; L, M: Extended; S: String; begin L := 10000000; // großer Wert ;) S := ''; for I := 0 to ComponentCount - 1 do begin if (Components[I] is TControl) and (Components[I] <> Sender) then begin with TControl(Components[I]) do M := sqrt( sqr((Left + Width) / 2 - (TControl(Sender).Left + TControl(Sender).Width) / 2) + sqr((Top + Height) / 2 - (TControl(Sender).Top + TControl(Sender).Height) / 2)); if L > M then begin S := TControl(Components[I]).Name; L := M; end; end; end; ShowMessage('Nächste Komponente: ' + S); end; |
Gruß wulfskin!
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.