![]() |
Objekt soll Referenz auf sich zurückliefern
Hallo,
ich habe ein Problem und komme nicht weiter. Ein Objekt soll die Referenz auf sich als Resultat zurückliefern. Also nach dem Motto. Wenn du getroffen bist, dann liefere dich selbst zurück. Im aufrufenden Programm kann dann die aktiveFigur auf die getroffene Figur gesetzt werden. Wie kann "das Objekt sich selbst zurückliefern?" Hier der Programmcode einer Methode eines Qbjektes (result := self funktioniert nicht!):
Code:
Aufrufen will ich es:
function TQuadrat.getroffen (pHPosition: real; pVPosition: real) : TFigur;
begin if ((pHPosition > self.gibHPosition) AND (pHPosition < self.gibHPosition+zGroesse) AND (pVPosition > self.gibVPosition) AND (pVPosition < self.gibVPosition+zGroesse)) then // dies ist die Figur begin hatStift.zeichneRechteck(10,10); result := Self; end else begin if (kenntNachfolger <> NIL) then begin kenntNachfolger.getroffen(pHPosition,pVPosition); end else result := NIL; end end;
Code:
Für Hilfe wäre ich sehr dankbar.
aktiveFigur.deaktiviere;
// checken, welches Quadrat getroffen wurde aktiveFigur := meineFiguren.getroffen(dieMaus.hPosition,dieMaus.vPosition); aktiveFigur.aktiviere; Gruss Gunnar |
Re: Objekt soll Referenz auf sich zurückliefern
Wie sind TFigur und TQuadrat definiert? Ist TQuadrat von TFigur abgeleitet?
|
Re: Objekt soll Referenz auf sich zurückliefern
Hallo,
TFigur ist die abstrakte Klasse. TQuadrat (und dann TKreis) sind davon abgeleitet. Methode getroffen wird in TQuadrat und TKreis überschrieben. Gruss Gunnar |
Re: Objekt soll Referenz auf sich zurückliefern
Wie ist meineFiguren definiert?
|
Re: Objekt soll Referenz auf sich zurückliefern
OK, grundsätzlich müsste es also funktionieren. Allerdings kann man mit "funktioniert nicht" nicht sonderlich viel anfangen. ;) Welche Fehlermeldung bekommst du denn genau?
Versuch mal, als Rückgabewert nicht TFigur, sondern TQuadrat anzugeben. |
Re: Objekt soll Referenz auf sich zurückliefern
Hallo,
meineFiguren ist vom Typ TFigur; Sorry Fehlermeldung bedeutet: das Objekt wird nicht zurückgeliefert. Er macht nicht. Er kommt in die Verzweigung, in der result:=self; steht. Das läuft. Aber wenn ich das zweite Quadrat anklicke, wird dieses kleine Quadrat (hatStift.zeichneRechteck(10,1) gezeichnet, aber das aktuelle Objekt kommt nicht zurück. Im Hauptpgrogramm wird also aktiveFigur nicht gesetzt. Zitat:
Hintergrund: In meineFigure speichere ich eine verkettete Liste mit allen Figuren, die der Benutzer erstellt. Die Liste soll dann in getroffen durchgegangen werden, bis zum Ende. Beim Treffer soll das entsprechende Objekt sich selbst zurückliefern, so dass ich das aktive Objekt drauf zeigen lassen kann. Frage ist: wie kann das Objekt, welches getroffen wurde und vom Type TFigur ist, sich zurückliefern (auch Typ TFigur)? Gruss Gunnar |
Re: Objekt soll Referenz auf sich zurückliefern
Hallo Gunnar,
Delphi-Quellcode:
Funktioniert es so besser?
// kenntNachfolger.getroffen(pHPosition,pVPosition);
Result := kenntNachfolger.getroffen(pHPosition,pVPosition); Gruß Hawkeye |
Re: Objekt soll Referenz auf sich zurückliefern
Code:
Ich vermute, dass kenntNachfolger vom Typ TFigur ist, und die "getroffen"-Methode eines weiteren Objektes aufrufen soll, soweit hinterlegt. Du musst dabei dann natürlich auch das result "durchreichen", ähnlich wie bei einer Rekursion. Das Vorgehen ist auch so halb rekursiv - es wird ja immer die gleiche Methode aufgerufen, bis eine Abbruchbedingung (in dem Fall eine von zweien) erfüllt ist. Nur dass die Methoden jeweils zu unterschiedlichen Instanzen gehören, und lediglich Namen und Signatur teilen. (Sowas bastel ich auch immer gern in der Art :))
function TQuadrat.getroffen (pHPosition: real; pVPosition: real) : TFigur;
begin if ((pHPosition > self.gibHPosition) AND (pHPosition < self.gibHPosition+zGroesse) AND (pVPosition > self.gibVPosition) AND (pVPosition < self.gibVPosition+zGroesse)) then // dies ist die Figur begin hatStift.zeichneRechteck(10,10); result := Self; end else begin if (kenntNachfolger <> NIL) then begin result := kenntNachfolger.getroffen(pHPosition,pVPosition); // <-------- end else result := NIL; end end; \\edit: No red box, jamjam =) |
Re: Objekt soll Referenz auf sich zurückliefern
Hallo
Zitat:
Das Objekt soll sich selber zurückliefern. Geht das einfach mit result:=self? kenntNachfolger ist auch vom Type TFigur: richtig. Ich reiche das ja durch. Wenn die Trefferbedingung erfüllt ist, soll das Objekt sich dann zurückliefert. Rekursiv ist es so nicht, da es sich nicht selber aufruft, sondern durch eine Verkettung durchhangelt. Man könnte es - wie du sagst - halbrekursiv nennen. Gruss gunnar |
Re: Objekt soll Referenz auf sich zurückliefern
Hallo,
hat jemand noch eine Idee? Ich habe weiter probiert - bisher nichts... Ist die Logik denn richtig, dass Result:=self; eine Referenz auf das Objekt zurückgibt? Oder denke ich da falsch? Viele Grüße und danke für die bisherige Hilfe. Gunnar |
Re: Objekt soll Referenz auf sich zurückliefern
Hallo Gunnar,
der Ansatz mit Result:=self ist schon richtig. Aber Hawkeye219 und dizzy haben mit ihren Vorschlägen recht, denn das gefundene Objekt muß ja durch den Stapel der aufgerufenen Funktionen zurückgereicht werden. Wenn Quadrat2 angeklickt wird, arbeitet Deine Lösungsvariante wie folgt: Hauptprozedur ruft Quadrat1.getroffen auf Quadrat1.getroffen ruft Quadrat2.getroffen auf Quadrat2.getroffen liefert Quadrat2 an Quadrat1.getroffen zurück Quadrat1.getroffen liefert kein ergebnis an die Hauptprozedur zurück (und sollte deshalb Quadrat2 durchreichen) Du solltest den Vorschlag von Hawkeye219 und dizzy noch einmal gründlich testen. Wie stellst Du denn fest, daß kein Objekt zurück geliefert wird? Vielleicht liegt Dein Problem inzwischen gar nicht mehr in der getroffen-Routine. |
Re: Objekt soll Referenz auf sich zurückliefern
Hallo Liste,
vielen Dank für alle und schnelle Hilfe. Ich habe das Problem zwar leider nicht lösen können - mal sehen, vielleicht komm eich später noch dazu. Danke auf jeden Fall für alle Tips. Gruss Gunnar |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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