Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Eigenen Operator definieren?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 759
Wohnort: Ruhrpott

BeitragVerfasst am: 13.12.2016, 17:41    Titel: Eigenen Operator definieren? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4131
Wohnort: ~/

BeitragVerfasst am: 13.12.2016, 19:30    Titel: Antworten mit Zitat

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. ä.)
_________________
Meine Großeltern waren als junge Menschen sehr modern - sie hatten schon damals in der Badewanne Email.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 759
Wohnort: Ruhrpott

BeitragVerfasst am: 14.12.2016, 09:32    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Neue Operatoren kannst du damit nicht einführen.
Danke, das hatte ich mir schon gedacht. traurig

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. grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9695
Wohnort: Neben der Festplatte

BeitragVerfasst am: 14.12.2016, 15:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 759
Wohnort: Ruhrpott

BeitragVerfasst am: 15.12.2016, 13:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2442
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 15.12.2016, 21:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 759
Wohnort: Ruhrpott

BeitragVerfasst am: 15.12.2016, 22:37    Titel: Antworten mit Zitat

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 grinsen ).

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz