Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Prüfen, ob Funktion Rückgabewert hat
der organist - Mo 08.02.10 23:23
Titel: Prüfen, ob Funktion Rückgabewert hat
Netten Abend allerseits,
ich habe momentan ne Prozedur, die auch soweit funktioniert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function TForm1.GetFeld(AX: Integer; AY: Integer):TFeld; var k,l: Integer; begin for k := 0 to 15 - 1 do for l := 0 to 10 - 1 do if (((AX-40-EckeX) div 30)=Karte.Map[k,l].PosX)AND (((AY-40-EckeY) div 30)=Karte.Map[k,l].PosY)AND ((AX-40)>EckeX)AND ((AY-40)>EckeY) then Result:=Karte.Map[k,l]; end; |
TFeld hat unter anderem ne x und y Koordinate und ne BitMap.
Mein Problem ist, dass ich nicht weiss, wie ich bei der Funktion herausfinden soll, ob es nen Rückgabewert gibt. Momentan hab ich da so nen Code. Darin geht es darum, bei einem Mausklick herauszufinden, ob es darunter ein Spielfeld gibt und dann die Position (X und Y) im Label testweise auszugeben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin try Label1.Caption:=IntToStr(GetFeld(X,Y).PosX)+ '/'+IntToStr(GetFeld(X,Y).PosY); finally
end; end; |
Wenn allerdings dort kein Feld ist, dann gibt es "komische" Positionswerte. Ich möchte eigentlich nicht jedesmal überprüfen, ob diese Werte stimmen können, sondern dies in die Funktion schreiben. Ich bräuchte also sowas wie nen zweiten Rückgabewert (Boolean), da ich in folgendem Thread gelesen hab, dass ne globale Variable sch - nich gut ist. Allerdings bin ich aus dem Thread auch nich schlau geworden, was jetzt für mich passend ist oder noch viel blöder, wie ich es dann code.
Diesen Thread mein ich [
http://www.delphi-forum.de/viewtopic.php?t=84307&highlight=r%FCckgabe+funktion//url]
Gruss, Lukas
Flamefire - Mo 08.02.10 23:31
eine funktion MUSS(!!!) einen rückgabewert haben
Bei dir sollte der Compiler meckern, was du nicht(!!!) ignorieren darfst.
Bei dir sollte es gehn, in dem du am Anfang von getFeld "Result:=nil" setzt und das dann gezielt abfragst. Funktioniert aber nru wenn TFeld ein Objekt ist.
alternativ eine prozedur mit 2 referenzparametern ("var " vorm name) statt der funktion
einen davon nimmst du als feld, den anderen als boolean wert, ob ein feld gefunden wurde.
der organist - Mo 08.02.10 23:51
hei,
das mit den komischen werten lag an nem Verdreher mit < und >. Und jetzt kommen auch die Exceptions, wenns nich der richtige Bereich is. Wie genau stellst du dir das mit der Prozedur vor?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure GetFeld (var MyFeld:TFeld; var MyBoolean:Boolean); begin for k := 0 to 15 - 1 do for l := 0 to 10 - 1 do if (((AX-40-EckeX) div 30)=Karte.Map[k,l].PosX)AND (((AY-40-EckeY) div 30)=Karte.Map[k,l].PosY)AND ((AX-40)>EckeX)AND ((AY-40)>EckeY) then Result:=Karte.Map[k,l]; end; |
so gaanz ungefähr?
Gruss, Lukas
Nersgatt - Di 09.02.10 09:17
Na, mit dem Boolean-Feld gibst Du einfach zurück, ob die letzte Bedinung erfüllt wurde:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure GetFeld (var MyFeld:TFeld; var MyBoolean:Boolean); begin MyBoolean := False; for k := 0 to 15 - 1 do for l := 0 to 10 - 1 do if (((AX-40-EckeX) div 30)=Karte.Map[k,l].PosX)AND (((AY-40-EckeY) div 30)=Karte.Map[k,l].PosY)AND ((AX-40)>EckeX)AND ((AY-40)>EckeY) then begin MyFeld := Karte.Map[k,l]; MyBoolean := True; end; end; |
BenBE - Di 09.02.10 17:50
Und nun noch MyBoolean als out-Parameter statt var-Parameter übergeben, dann meckert der Compiler auch nicht, wenn MyBoolean in der aufrufenden Funktion nicht initialisiert wurde.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!