Entwickler-Ecke

Sonstiges (Delphi) - Button auf einen anderen fixieren


René R.Fo. - Sa 31.10.09 17:44
Titel: Button auf einen anderen fixieren
Hallo
Ich möchte einen Button auf einen anderen Fixiren ich kann ihn zwar bewegen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  ReleaseCapture; 
  Button1.Perform(wm_syscommand,$f0120); 
end;

aber ich möchte ihn auf denn Button fixieren.
Ich habe 2 Button wo man sich entscheiden kann denn 1. draufzulegen
Das Problem:
das Fixiren, nur wenn es 100% übereinander ist geht es "weiter"


Lannes - Sa 31.10.09 20:20

Hallo,

dann prüf in Button1MouseMove ob einer der Buttons 100%-Übereinstimmung bezogen auf die Koordinaten X / Y hat, dann gehts "weiter".
(was auch immer "weiter" bedeuten mag, es entzieht sich meiner Kenntnis :wink:)


René R.Fo. - So 01.11.09 12:44

NahGut habe ich schon aber ich möchte wenn Der 1. Button einen anderen berührt das der dann komplett darauf kommt wie z.b. auf´m desktop mit den Symbolen.


jaenicke - So 01.11.09 14:15

Dann musst du beim Loslassen schauen, ob er den anderen Button berührt. Wenn ja, dann musst du die Position auf die des anderen Buttons setzen, fertig.


René R.Fo. - So 01.11.09 15:17

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Dann musst du beim Loslassen schauen, ob er den anderen Button berührt. Wenn ja, dann musst du die Position auf die des anderen Buttons setzen, fertig.

das ist mein Problem :oops:


jaenicke - So 01.11.09 15:19

Die Prüfung, ob eine Ecke des einen Knopfes in dem Bereich des anderen Knopfes liegt (sie sich überlappen also)? Oder das Setzen der Position? :gruebel:


René R.Fo. - So 01.11.09 15:46

Prüfen ob sie sich berühren wenn Ja dann übereinanderlegen z.b.:

Delphi-Quelltext
1:
2:
3:
4:
5:
If (fehlender Code) then 
begin
     Button2.Left := Button1.Left;
     Button2.Top  := Button1.Top;
end;

ungefähr so.


jaenicke - So 01.11.09 16:02

Zwei Möglichkeiten:
Erstens mit PtInRect alle vier Ecken prüfen, ob die im Rechteck des anderen Buttons liegen.
Oder zwei Regionen erstellen und testen, ob diese sich irgendwo überschneiden, dafür gibt es API Funktionen. Ich finde das nicht so sinnvoll, aber es ist vielleicht ein kleines bisschen einfacher.


René R.Fo. - Mi 04.11.09 12:27

Ok kannst du mit bitte denn text vervollständigen denn ich geschickt habe?
ich kann auch keine Hilfe Öffnen :oops: :oops:


jaenicke - Mi 04.11.09 19:28

user profile iconRené R.Fo. hat folgendes geschrieben Zum zitierten Posting springen:
ich kann auch keine Hilfe Öffnen :oops: :oops:
Erstens: Warum bringst du das nicht zuerst in Ordnung? Unter Vista z.B. gibt es dazu die Anleitung in der Library.

Zweitens: Kein Problem, nimm doch die Online-Hilfe:
http://ref.dp200x.de/?query=PtInRect
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Types_PtInRect.html
http://www.delphibasics.co.uk/RTL.asp?Name=PtInRect
...


Xion - Mi 04.11.09 23:32

Man könnte es ja auch von Hand machen:


Delphi-Quelltext
1:
2:
3:
if ( (Button1.Left>Button2.Left)and(Button1.Left+Button1.Width<Button2.Left) 
  or (Button2.Left>Button1.Left)and(Button2.Left+Button2.Width<Button1.Left))
  and (Top analog) then


Anmerkung: Aufm Desktop ists so, dass sich die Icons einem Raster anordnen. Falls du sowas hast, ists natürlich viel einfacher.


Delphi-Quelltext
1:
Button1.Left:=Button1.Left-(Button1.Left mod RASTERGROESSE);                    


Boldar - Sa 07.11.09 01:34

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:

Anmerkung: Aufm Desktop ists so, dass sich die Icons einem Raster anordnen. Falls du sowas hast, ists natürlich viel einfacher.


Delphi-Quelltext
1:
Button1.Left:=Button1.Left-(Button1.Left mod RASTERGROESSE);                    


Das ist aber auch falsch, denn so geht es immer nach links. Man müsste eher so eine art round implementieren.


René R.Fo. - Do 19.11.09 20:41

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:


Anmerkung: Aufm Desktop ists so, dass sich die Icons einem Raster anordnen. Falls du sowas hast, ists natürlich viel einfacher.


Delphi-Quelltext
1:
Button1.Left:=Button1.Left-(Button1.Left mod RASTERGROESSE);                    


Delphi erkennt RASTERGOESSE nicht wendarn habe ich das falsch verstanden oder es geht nicht
ich habe Delphi5


René R.Fo. - So 20.12.09 13:43

Ich habe es jetzt anders gelöst trotzdem danke für die antworten:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
     ReleaseCapture;
     Button1.Perform(wm_syscommand,$f0120);

     If (Button1.Top<48and (Button1.Left<48then
     begin
          Button1.Top := Button2.Top;
          Button1.Left := Button2.Left;
     end;

     If (Button1.Top<216and (Button1.Top>176and (Button1.Left<48and (Button1.Left>8then
     begin
          Button1.Top := Button3.Top;
          Button1.Left := Button3.Left;
     end;

     If (Button1.Top<264and (Button1.Top>224and (Button1.Left<120and (Button1.Left>80then
     begin
          Button1.Top := Button4.Top;
          Button1.Left := Button4.Left;
     end;

noch mal danke :)