Autor Beitrag
SchwarzerVampir
Hält's aus hier
Beiträge: 3


Delphi 7
BeitragVerfasst: So 30.04.06 11:43 
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.

ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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)

ausblenden 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~

_________________
Aya
I aim for my endless dreams and I know they will come true!