SchwarzerVampir - So 30.04.06 11:43
Titel: Probleme mit Mouse-Koordinaten
Hallo,
ich möchte in meiner Anwendung gerne ein paar Grafikelemente einbauen, die so zu sagen als "Button" funktionieren sollen. Um es konkret zu beschreiben, ich male ein Universum mit Sternen und Galaxien und möchte, dass der Benutzer auf die Galaxien klicken kann um einen neue Ansicht zu bekommen.
Ich habe bisher meine Galaxien in einem Array gespeichert, jede Galaxie hat eine "Range" (TRect), mit der ich prüfen möchte, ob die Mouse-Koordinaten in dieser Range einer Galaxie sind.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function TSDUniverse.getGalaxyIndexAt (mouseX, mouseY: integer): integer; var index: integer; i: integer; r: TRect;
begin index := -1;
for i:= 0 to length(fGalaxies) do begin r := fGalaxies[i].getRange; if (mouseX >= r.Left) and (mouseX <= r.Right) and (mouseY >= r.Top) and (mouseY <= r.Bottom) then begin index := i; end; end; result := index; end; |
Diese Funktion soll angeben, an welcher Array-Position sich die angeklickte Galaxie befindet. Nur leider gibt sie mir verdächtig oft -1 zurück.
Kann es sein, dass GDI+ irgendwie ein anderes System für seine Mouse-Koordinaten verwendet und dass ich dafür irgendwelche Umwandlungen brauche? Wenn ja, kann mir jemand sagen, wie das geht? Wenn nein, was habe ich dann falsch gemacht?
Gruß
Schwarzer Vampir
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt
Aya - Mo 01.05.06 04:16
Hi,
ich glaub nicht das GDI+ irgendwas anders macht... aber in deiner funktion sind fehler drin die wenn man es genau nimmt das programm eigenlich jedesmal abschießen müßten... ka wieso das nicht passiert :)
du gehst in einer for-schleife von 0 -> Length(xx).. nehmen wir an wir haben diesen Array: Bla[0..3]
Der befehl Length() liefert hier als länge 4 zurück, denn der Array hat ja 4 Felder.. würde ich jetzt auf Bla[4] zugreifen stürzt normlerweise das programm ab (bzw gibt halt ne fehlermeldung).
Deswegen solltest du in der Schleife nur bis Length(xx)-1 gehen :)
Oder was noch besser ist Low/High benutzen. (Hab die funktion mal umgeschrieben, so wie ich sie schreiben würde)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function TSDUniverse.getGalaxyIndexAt(mouseX, mouseY: Integer): Integer; var i: Integer; begin Result:=-1; for i:=Low(fGalaxies) to High(fGalaxies) do begin if PtInRect(fGalaxies[i].getRange, Point(mouseX, mouseY)) then begin Result:=i; Break; end; end; end; |
Au'revoir,
Aya~