Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Button soll seine Position ändern, wenn Maus in der Nähe ist


Terra23 - Sa 10.04.10 19:22
Titel: Button soll seine Position ändern, wenn Maus in der Nähe ist
Hi!

Ich würde gern wissen, ob es einen ganz simplen Code gibt, der es möglich macht, dass ein Button seine Position verändert, sobald der Mauszeiger in dessen Nähe kommt.
Ich möchte damit niemanden belästigen sondern das nur nutzen, um die Kids auf meiner Gruppe ein wenig zu ärgern. Es steckt also keine illegale Absicht dahinter.

Über die Suche habe ich nichts passendes gefunden.

MfG

Terra


Gausi - Sa 10.04.10 19:29

Du könntest im OnMouseMove der Form (oder des Panels/Groupbox/... wo der Button drauf liegt) abfragen, ob die Maus in der Nähe ist, und dann den Button umsetzen.


Terra23 - Sa 10.04.10 19:31

Soweit ist mir das Prinzip schon klar. Wenn ich mich jedoch dransetze (nicht, dass ich es nicht versuchen wollen würde), kommt ewig langer Code raus und das geht sicherlich mit ein paar Zeilen.

Zudem habe ich gerade 24-Stunden-Schicht und leider keine Möglichkeit, an mein Delphi zu kommen.

Terra


Gausi - Sa 10.04.10 19:35

Naja, das ist so ne längliche If-Abfrage


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// weniger als 20 pixel Abstand ist "nah"
if ((x > Button.left - 20and (x < Button.Left + Button.Width + 20))
  and
  ((y > Button.Top - 20and (y < Button.Top + Button.Height + 20))
then
  ...


Delete - Sa 10.04.10 20:46

Dann zeig uns doch mal deinen Code.


Terra23 - Sa 10.04.10 23:58

@Luckie: Das werde ich tun, wenn ich den Code fertig habe. Wie gesagt, ich habe heute eine 24-Stunden-Schicht und die endet erst morgen (Sonntag) um 08:00 Uhr morgens. Und ich darf auf dem Gruppenrechner keine Software installieren, d.h. kein Delphi, kein Sacred, kein Need For Speed Most Wanted. :(

Daher muss ich warten, bis ich daheim am Laptop sitze.

@Gausi: Ich habe mir das mal aufgezeichnet. Ich danke dir für deinen Code, aber ich bin mir recht sicher, dass zwischen die Abfragen bei X und Y ein OR gehört, sprich:

Wenn X sowieso ODER X sowieso

UND

Wenn Y sowieso ODER Y sowieso

Aber das muss ich halt erstmal am Laptop probieren.

Werde mich dann wieder melden.

THX erstmal @ all.

Terra


elundril - So 11.04.10 00:07

nein das mit den ands passt schon. du willst ja das es nur in einem gewissen radius passiert. ;) rechne es dir aus mit einer Wahrheitstabelle. ;)

lg elundril


ffgorcky - Sa 17.04.10 10:55

Entschuldigt mal Leute,
mir ging gerade solch eine Möglichkeit durch den Kopf, dass man den Button mittig auf ein Panel legt, das die Größe des Mindestabstands hat, dieses dann visible=false macht und dann eine OnMouseOver-Procedure dafür schreibt.
Ich kann es nur im Moment leider nicht ausprobieren, also weiß ich nicht, ob es mit einem unsichtbaren Panel so geht, aber ich denke, dass diese Möglichkeit sonst doch noch einfacher wäre.


Gausi - Sa 17.04.10 11:53

Wenn das Panel unsichtbar ist, ist es der Button darauf auch. Und von einem MouseOver bekommt das unsichtbare Panel auch nichts mit. ;-)


Hidden - Sa 17.04.10 11:56

Ein(sichtbares) Frame könnte gehen.


Delete - Sa 17.04.10 15:05

Ich dachte auch solche Scherzprogramme würden hier nicht unterstützt?


Gausi - Sa 17.04.10 15:24

Ich seh das hier eher als "Test".

Aufgabe: Klick den Button.
Lösung: Tabtaste und Enter. :mrgreen:

Das Programm dürfte weder Schaden anrichten, noch den User sonstwie wirklich ärgern. :nixweiss:


Hidden - Sa 17.04.10 15:36

TabStop := false; :mrgreen: (auch das wird niemanden von Taskleistenbutton oder Task-Manager abhalten)


ffgorcky - So 25.04.10 10:41

Zu meiner Panel-Möglichkeit:
Man müsste doch nur dem Panel die Option BorderStyle:=bsNone geben,
oder irgendwie in dieser Art heißt das doch.
Wenn das Panel dann die gleiche Farbe wie der Fensterhintergrund hat, dann dürfte man es doch nicht sehen, wenn es normal sichtbar ist.

Eine weitere Möglichkeit wäre doch aber auch, wenn man das Panel unsichtbar haben möchte, dass man das dann so macht, indem beide den Owner Form haben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure Panel.OnMouseOver(Sender)
begin
Panel.Left:=random(Form.Width-Panel.Width);
Panel.Top:=random(Form.Height-Panel.Height);
Button.Left:=Panel.Left+((Panel.Width div 2)-(Button.Width div 2));
Button.Top:=Panel.Top+((Panel.Height div 2)-(Button.Height div 2));
end;


Ich denke zumindest, dass das so klappen müsste, kann es aber gerade nicht ausprobieren.


elundril - So 25.04.10 13:10

Ja, klappen müsste es, aber es ist ungefähr genauso programmiertechnisch richtig, wie eine unsichtbare Memo-Komponente zum speichern von Variablen zu verwenden.

Oder anders gesagt: Ich kann auch auf Rollerskates ne Achterbahn fahren. Nur weils Machbar ist, ist es nicht sinnvoll.

Theoretisch könntest du dir aber auch ein TRect definieren und dann im MouseMove PtInRect() zusammen mit einer If-Abfrage verwenden.

lg elundril