Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
Prüfen, ob Funktion Rückgabewert hat
spacer
Autor Nachricht
der organist
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star

Beiträge: 344
Dabei seit: 12.07.2008
Wohnort: Lippstadt im schönen Ostwestfalen

WIN XP
NQC, Basic, Delphi
BeitragVerfasst: Mo 08.02.10 23:23  Antworten mit Zitat Beitrag melden
Netten Abend allerseits,

ich habe momentan ne Prozedur, die auch soweit funktioniert:

ausblenden Delphi-Quelltext markieren
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.

ausblenden Delphi-Quelltext markieren
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

Gruss, Lukas

_________________
Lukas
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Private Nachricht sendenPosting in privater Nachricht zitieren
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Nussknacker 2009 - 1. Rang

Beiträge: 1014
Erhaltene Danke: 14
Dabei seit: 03.01.2007
Wohnort: Dresden

Win XP
Delphi 7 Pro; Delphi 2009 Pro
BeitragVerfasst: Mo 08.02.10 23:31  Antworten mit Zitat Beitrag melden
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.
Private Nachricht sendenPosting in privater Nachricht zitieren
der organist
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star

(Threadstarter)

Beiträge: 344
Dabei seit: 12.07.2008
Wohnort: Lippstadt im schönen Ostwestfalen

WIN XP
NQC, Basic, Delphi
BeitragVerfasst: Mo 08.02.10 23:51  Antworten mit Zitat Beitrag melden
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?

ausblenden Delphi-Quelltext markieren
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];
// hier iwie den Boolean, aber wie?
end;


so gaanz ungefähr?

Gruss, Lukas

_________________
Lukas
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Private Nachricht sendenPosting in privater Nachricht zitieren
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star

Beiträge: 525
Erhaltene Danke: 2
Dabei seit: 11.11.2008
Wohnort: Emlichheim


Delphi 2010 Enterprise
BeitragVerfasst: Di 09.02.10 09:17  Antworten mit Zitat Beitrag melden
Na, mit dem Boolean-Feld gibst Du einfach zurück, ob die letzte Bedinung erfüllt wurde:

ausblenden Delphi-Quelltext markieren
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; // Wir gehen erst mal davon aus, dass es nicht klappt
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 //beachte hier das Begin..end
MyFeld := Karte.Map[k,l];
MyBoolean := True; //Jau, hat geklappt!
end;
end;

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Private Nachricht sendenPosting in privater Nachricht zitieren
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Nussknacker 2009 - 1. Rang

Beiträge: 8056
Erhaltene Danke: 17
Dabei seit: 16.07.2004
Wohnort: Jahnsdorf

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, L0.9\FPC2.0
BeitragVerfasst: Di 09.02.10 17:50  Antworten mit Zitat Beitrag melden
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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home