Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi In Kreis klicken funktioniert nicht (https://www.delphipraxis.net/141750-kreis-klicken-funktioniert-nicht.html)

SaFu 15. Okt 2009 11:52


In Kreis klicken funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tach,

hatte vor längerer Zeit schonmal das Thema gehabt und konnte das problem bis jetzt nicht beheben.

Ich habe drei TShaps übereinander liegen jetzt so geprüft werden im welchen Shape(als Kreis) sich die Maus befindet.

Das Problem ist jetzt das es zu ungenau ist wie bekomme ich das genauer hin.

So sieht bis jetzt meine Procedure aus
Delphi-Quellcode:
procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Inside: Boolean;
  R: Extended;
begin
  if Shape1.Width < Shape1.Height then
   R := Shape1.Width/2
  else
   R := Shape1.Height/2;

  Inside := Sqr(X - R) + Sqr(Y - R) <= Sqr(R);

  if inside then
   begin
     lblPreis.Caption:= '55€';
   end;
end;
Projekt ist mal im Anhang.

Danke schon mal im voraus

franktron 15. Okt 2009 11:57

Re: In Kreis klicken funktioniert nicht
 
Warum machst du das mit shapes und nicht mit einem Image

SaFu 15. Okt 2009 12:07

Re: In Kreis klicken funktioniert nicht
 
Ich brauche das ganze Transparent mit einer Linie darum und rund muss es auch sein. Da bietet mir das Shape eine rheie von Einstellungen

alleinherrscher 15. Okt 2009 12:14

Re: In Kreis klicken funktioniert nicht
 
Die Lösung is ganz einfach: Wenn du es tatsächlich mit den Shapes machen willst, musst du bei den Mousemove Prozeduren von Shape1 und Shape2 abfragen ob sich die Maus evtl in Shape3 befindet... bzw. andersherum...du musst auf jedenfall in jedem Mausmove ereignis alle kreise abfragen...

DeddyH 15. Okt 2009 12:24

Re: In Kreis klicken funktioniert nicht
 
Am Einfachsten erscheint mir eine Lösung mit Regions, d.h. man erstellt sich eine Funktion, der man die Mauskoordinaten sowie die Eckpunkte des umgebenden Rechtecks übergibt, worauf die temporär mit CreateEllipticRgnIndirect eine Region erstellt und mit PtInRgn prüft, ob sich die Koordinate innerhalb dieser Region befindet. Das erspart zumindest eine Menge Rechnerei und sollte ausreichend genau sein.

[edit] Wobei natürlich der berechtigte Einwand von alleinherrscher zu berücksichtigen ist. Also entweder (Pseudocode):
Code:
wenn im äußeren Kreis:
  wenn im mittleren Kreis:
    auch im inneren Kreis?
oder
Code:
wenn nicht im inneren Kreis:
  wenn nicht im mittleren Kreis:
    im äußeren Kreis?
[/edit]

alleinherrscher 15. Okt 2009 12:47

Re: In Kreis klicken funktioniert nicht
 
Edit: @DeddyH: Yeah, wir sind ja voll das Team geworden :P

Versuchs mal hiermit:

Delphi-Quellcode:
uses math;

Delphi-Quellcode:
function TForm1.MouseToMoney:string;
var R: array [1..3] of single;
    MausRadius:single;
    i,MausInShape:integer;
    Mittelpunkt:tPoint;
    MausPosition:tPoint;
begin

 MausPosition:=ScreenToClient(Mouse.CursorPos);

 R[1]:=min(Shape1.Width,Shape1.Height) / 2;
 R[2]:=min(Shape2.Width,Shape2.Height) / 2;
 R[3]:=min(Shape3.Width,Shape3.Height) / 2;

 Mittelpunkt.x:=Shape1.left+round(R[1]);
 Mittelpunkt.y:=Shape1.top+round(R[1]);

 MausInShape:=0;

 for i:=3 downto 1 do
 if sqr(Mausposition.x-mittelpunkt.x) + sqr(Mausposition.y-Mittelpunkt.y) <= sqr(r[i]) then
   MausInShape:=i;

 case MausInShape of
  0:result:='--';
  1:result:='55€';
  2:result:='75€';
  3:result:='95€';
 end;
end;

Bitte in jedem MouseMove Ereigniss aufrufen:

Delphi-Quellcode:

 lblPreis.Caption:=MouseToMoney;

Schönen Tag noch, Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz