Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 13.12.2016, 17:41 Titel: Eigenen Operator definieren? |
|
|
Hallo Leute!
Ich würde gerne einen eigenen Vergleichsoperator "isIn" definieren, der anzeigt, ob ein Punkt innerhalb eines Rechtecks liegt oder nicht, Code: | Operator isIn (punkt As Point, fenster As RECT) As Boolean
If (punkt.x >= fenster.left) AndAlso _
(punkt.x <= fenster.right) AndAlso _
(punkt.y >= fenster.top) AndAlso _
(punkt.y <= fenster.bottom) Then
Return TRUE
Else
Return FALSE
EndIf
End Operator | bekomme aber die Fehlermeldung...Expected operator, found 'isIn' in 'Operator isIn (punkt As Point, fenster As RECT) As Boolean' Auch alle anderen Versuche mit Dim und Declare haben nicht funktioniert.
EDIT:
Inzwischen habe ich einen Workaround gefunden: Code: | #Include Once "windows.bi"
#Define isIn =
Operator = (punkt As Point, fenster As RECT) As Boolean
If (punkt.x >= fenster.left) AndAlso _
(punkt.x <= fenster.right) AndAlso _
(punkt.y >= fenster.top) AndAlso _
(punkt.y <= fenster.bottom) Then
Return TRUE
Else
Return FALSE
EndIf
End Operator
Dim As POINT punkt
Dim As RECT fenster
fenster.left = 100
fenster.top = 100
fenster.right = 200
fenster.bottom = 200
punkt.x = 150
punkt.y = 150
If punkt isin fenster Then
? "innerhalb"
Else
? "ausserhalb"
EndIf
punkt.x = 150
punkt.y = 250
If punkt isin fenster Then
? "innerhalb"
Else
? "ausserhalb"
EndIf
Sleep |
Aber trotzdem die Frage: Habe ich in der Befehlsreferenz etwas übersehen, oder ist das Definieren eigener Operatoren generell nicht möglich?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 13.12.2016, 19:30 Titel: |
|
|
OPERATOR dient lediglich zur Überladung ausgewählter existierender Operatoren für die eigene Klasse. Neue Operatoren kannst du damit nicht einführen. Möglich wäre eine entsprechende neue Methode wie
Code: | IF punkt.isin(fenster) THEN ... |
Das ist meines Wissens auch in anderen objektorientierten Sprachen das Standardvorgehen (streng objektorientiert geschrieben wäre ein Vergleich ja wert1.equal(wert2) o. ä.) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 14.12.2016, 09:32 Titel: |
|
|
nemored hat Folgendes geschrieben: | Neue Operatoren kannst du damit nicht einführen. | Danke, das hatte ich mir schon gedacht.
Aber das Verfahren mit dem umdefinierten Gleichheitszeichen erfüllt ja den gleichen Zweck und hat gegenüber einer neu definierten Methode den Vorteil, daß ich die WinAPI - Strukturen POINT und RECT direkt vergleichen kann. Ich bilde mir (zumindest im Augenblick noch) ein, daß das lesbarer ist.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.12.2016, 15:05 Titel: |
|
|
Zitat: | und hat gegenüber einer neu definierten Methode den Vorteil, daß ich die WinAPI - Strukturen POINT und RECT direkt vergleichen kann. Ich bilde mir (zumindest im Augenblick noch) ein, daß das lesbarer ist |
Nur so als Ideengebung, was das MFC-Framework in C++ macht und auch unter FreeBASIC möglich ist: MFC hat seine eigenen Klassen, die von POINT und RECT erben und die Funktionalität davon durch Funktionen ergänzen (z.B. um eine Methode, die prüft ob ein RECT einen POINT enthält). Da man eine spezifischere Klasse auch überall übergeben kann, wo die allgemeinere Klasse erwartet wird, kann man diese Objekte problemlos an WinAPI-Funktionen übergeben. Man muss dann nur halt seine eigene Klasse überall zum Deklarieren von Objekten verwenden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 15.12.2016, 13:31 Titel: |
|
|
Vielen Dank für den Hinweis, das Thema Vererbung ist -zumindest was die praktische Anwendung betrifft- bis jetzt noch ein weißer Fleck in meiner Programmierhistorie.
Für den Augenblick bin ich wunschlos glücklich, wenn ich mit Code: | If punkt isin fenster Then | ein verwertbares Ergebnis bekomme.
Es sei denn, es gibt eine (von mir bis jetzt unentdeckte) WinAPI - Funktion, die beim drag & drop das Handle (oder sonst ein Erkennungsmerkmal) des Fensters liefert, von dem ich das Element aufnehme, wenn dieses Fenster nicht im Vordergrund ist.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.12.2016, 21:54 Titel: |
|
|
grindstone hat Folgendes geschrieben: |
Für den Augenblick bin ich wunschlos glücklich, wenn ich mit
Code: | If punkt isin fenster Then |
ein verwertbares Ergebnis bekomme. |
Was spricht gegen folgende Syntax-Varianten?
Code: | Type Punkt
' Attribute/Implementation
End Type
Type Fenster
' Attribute/Implementation
End Type
Dim p As Punkt, f As Fenster
' Variante 1 (prozedural):
IF PunktIsInFenster(f, p) Then
' True-Block
End If
' Variante 2+3 (objektorientiert):
If p.liegtIn(f) Then
' True-Block
End If
If f.pruefeObInliegend(p) Then
' True-Block
End If |
Falls erwünscht, kann ich sonst ein lauffähiges Beispiel zusammenstellen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 15.12.2016, 22:37 Titel: |
|
|
dreael hat Folgendes geschrieben: | Was spricht gegen folgende Syntax-Varianten? | Nichts. Tatsächlich war mein erster Ansatz Code: | Function isIn(punkt As Point, fenster As RECT) As Boolean
If (punkt.x < fenster.left) OrElse _
(punkt.x > fenster.right) OrElse _
(punkt.y < fenster.top) OrElse _
(punkt.y > fenster.bottom) Then
Return FALSE
Else
Return TRUE
EndIf
End Function
| Da ich aber im selben Programm schon den "="-Operator überladen hatte, um zwei Rechtecke auf (Deckungs-)gleichheit zu prüfen und sich die beiden Code - Schnipsel so verblüffend ähnlich sahen, kam ich auf die Idee, auch hierfür einen Operator zu benutzen. Und da in der Befehlsreferenz etwas von DECLARE OPERATOR steht, dachte ich, daß man vielleicht einen Operator genauso deklarieren kann wie eine Prozedur.
Ist natürlich Geschmackssache, aber ich persönlich finde die Operator - Variante am einprägsamsten (und ist auch am wenigsten Tipparbeit ).
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|