Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Sa 15.03.03 23:30 
Ja, so währe es einfacher.

Dann habe ich das ja doch richtig verstanden. :shock:

Er hat ja panels auf den jewals eine Image ist richtig ?
Wenn ja könnte man das so lösen.

ausblenden Quelltext
1:
2:
3:
Panel1.Tag:=0;Imag1.Tag:=0;
Panel2.Tag:=1;Image2.Tag:=1;
....

der rest dürfe einfach sein...

_________________
MFG
Michael Springwald, "kann kein englisch...."
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: So 16.03.03 00:43 
Diese Beispiel zeigt, wie die angeglickte Komponente nach der nähsten Komponente sucht:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(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
      M := sqrt(sqr(TControl(Sender).Left - TControl(Components[I]).Left)
                + sqr(TControl(Sender).Top - TControl(Components[I]).Top));
      if L > M then begin
        S := TControl(Components[I]).Name;
        L := M;
      end;
    end;
  end;
  ShowMessage('Nächste Komponente: ' + S);
end;

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: So 16.03.03 05:22 
tommie-lie hat folgendes geschrieben:

Aber ich würde nicht mit Top/Left arbeiten, weil das ja nur die obere und linke Position ist, sondern mit Top+(Height/2) und Left+(Width/2), denn das ist der Mittelpunkt der Objekte. Damit beziehst du die Größe auch noch mit ein.


Ich dachte es ist nach dem Abstand der Bounds (Außenränder) gefragt!? :roll:
torstenheinze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 461



BeitragVerfasst: So 16.03.03 13:12 
mimi hat folgendes geschrieben:
Er hat ja panels auf den jewals eine Image ist richtig ?


nein :wink:
ich habe ein image und sieben (oder acht, je nach dem)panels



@wulfskin ichwerd deinen code ausprobieren, danke
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: So 16.03.03 14:10 
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:
ausblenden 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.
torstenheinze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 461



BeitragVerfasst: So 16.03.03 15:13 
vielen dank für die funktion. :D
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: So 16.03.03 15:22 
torstenheinze hat folgendes geschrieben:
vielen dank für die funktion. :D
Bitte bitte, aber wie gesagt, sie funktioniert nicht immer richtig. Aber vielleicht reicht sie ja bei deinem Problem!

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
torstenheinze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 461



BeitragVerfasst: So 16.03.03 15:26 
ne, leider nicht. ich werd die so umschreiben, das die kanten mitbedacht werden. trotzdem vielen dank für diese formel.