![]() |
Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Guten Morgen,
wie der Titel schon verrät such ich einen Code oder eine Code-Folge, die überprüft ob eine Komponente sich in einem bestimmten Bereich befindet. Es kann jede beliebige Komponente sein und dies Abfrage soll zur Laufzeit stattfinden. Mein Vater hat gesagt das es so was ähnliches auch bei anderen Programmiersprachen gäbe, mit dem Befehl "#.exist". Meine Delphi Kenntnisse sind noch nicht sonderlich groß, würde mich über ein paar Antworten freuen. Als bsp.: Eine shape-Komponente besitzt die Koordinaten 50/ 100 so wenn diese Shape-Komponente nun in den Bereich von 100/100 und 150/100, dann soll eine bestimmte procedure ablaufen. Ich möchte aber ungern alles mit eine IF - Abfrage machen da es mehrere Shape-Komponenten sind und nicht nur ein Bereich sondern 5 Bereiche überprüft werden sollen. Möchte auch den ProgrammCode kurz halten und auch übersichtlich lassen, ich glaube kaum das es funktioniert, wenn so viele if-Abfragen kommen ;) Gruß Snears |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Schau mal nach "IntersectRect".
|
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Ich habe mir bei DP und auch bei google "IntersectRect" eingegeben... auch die delphi hilfe habe ich benutzt.
Das einzige was ich erfahren konnte war das man das auch als funktion benutzen kann... nun habe ich aber keine ahnung wie ich überprüfen kann ob in dem bereich 0 bis 100 sich eine shape-komponente sich befindet könnte mir jmd einen eine kleine hilfe geben... und bitte sagt nicht ich solle doch nochmal die delphi hilfe benutzen oder ähnliches... weil die bringt mich kaum weiter :) danke |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Ehe wir aneinander vorbei reden:
Du hast eine sichtbare Komponente und willst wissen, ob sie innerhalb des Parent einen bestimmten Bereich überdeckt? Mich irritiert etwas, dass Du immer von 2 Koordinaten ausgehst, ein Rechteck besteht aber aus 4. IntersectRect liefert Dir eine Schnittmenge zweier Rechtecke bzw. die Information, ob ein Schnittbereich überhaupt vorliegt. Schreib nochmal eine Info, dann kann ich Details raussuchen. |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Delphi-Quellcode:
So in etwa müsste das doch funktionieren.
function Ueberlappung(R1, R2: TRect): Bool;
var dummy: TRect; begin Result := IntersectRect(dummy,R1,R2); end; ... if Ueberlappung(Shape1.BoundsRect, Shape2.BoundsRect) then ShowMessage('Aha'); |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Also gut...
Mehrere Shape-Komponenten bewegen sich auf dem Formular. Da es mir zu viele Shape-Komponenten sind und ich nicht für jede die gleiche Abfrage machen möchte, würde ich gerne nur mit einer einzigen anweisung gleich eine Überprüfung machen die für alle shape-Kompontenen zählt. Als Bsp.: Shape1 besitzt die Koordinaten x:= 10 y:= 150 so der x wert verändert sich durch einen timer um 5. Nun soll eine Überprüfung stattfinden ob sich diese Shape-Komponente in dem Bereich x >= 50 and x<= 150 und y >= 100 and y<= 200 dadurch entsteht ein rechteck (also nur gedanklich nicht, in dem Programm), so nun gibt es ja die Überprüfung mit
Code:
if (shape1.left >= 50) and (shape1.left <= 150) and shape1.top >= 100) and (shape1.top <= 200) then begin // dann kommt hier die anweisung was passieren soll end; so aber ich möchte ungern das für 20 shapes machen... ich möchte den Programmcode so kurz wie möglich halten ich hoffe ihr versteht mein Problem nun besser |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Ok, dann brauchst Du IntersectRect nicht.
Du willst ja nur die X- und Y-Koordinate eines Puntes prüfen. Dazu ist Deine Prüfung ja völlig in Ordnung. Evtl. kannst Du "InRange" verwenden, damit es etwas übersichtlicher wird. Und Du solltest eine Prozedur definieren, der Du ein (oder nacheinander alle) Shapes übergibst, die dann die Prüfung durchführt und ggf. die gewünschte Aktion veranlasst. Man könnte auch eine neue Shape-Komponente ableiten, die quasi "selbständig" bei jeder Posititionsänderung diese Prüfung und Aktion durchführt. Dazu muss man sich mit Komponentenentwicklung beschäftigen. Das hört sich schlimmer an als es ist :wink:, erfordert aber schon etwas Einarbeitungszeit. Wenn Dein Projekt mit Funktionen und Prozeduren funktioniert, kannst Du Dich mal daran setzen, das ggf. in eine eigene Komponente einzubauen... |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Okay danke für die antwort... dann werde ich mich mal wieder an mein Programm setzten :)
|
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Übrigens lässt sich die Abfrage ggf. mit
![]() |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Funktioniert denn dieses "IntersectRect" auch wenn eine shape Komponente unsichtbar ist?
Weil dann könnte man ja theoretisch ein unsichtbare Shape-Komponente auf das Formular legen und dann prüfen ob die sich treffen... oder habe ich jetzt einen Gedankenfehler? :? |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Das würde grundsätzlich gehen, da letztlich zwei Rechtecke (TRect) geprüft werden. Ob die zu einem Shape gehören und/oder das Shape visible ist, ist IntersectRect völlig egal.
Im Grunde werden der Funktion ja nur zwei Variablen TRect übergeben. Aber für Deine o.g. Problemstellung brauchst Du IntersectRect wie gesagt nicht wirklich. |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
IntersectRect und PtInRect bekommen nur 3 Rects bzw Rect und Point. Das hat mit Komponenten überhaupt nichts zu tun.
EDIT: dh Du kannst natürlich auch unsichtbare Komponenten abprüfen. |
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
Danke nochmal für die Antworten :thumb:
|
AW: Überprüfen ob eine Komponente sich in einem bestimmten Bereich befindet
IntersectRect prüft ja nur die im 2. und 3. Parameter übergebenen Rechtecke, da ist es ja egal, ob das Shape sichtbar ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz