| Autor |
Beitrag |
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mo 08.02.10 23:23
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
Gruss, 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
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: 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 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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
_________________ »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
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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; |
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ 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.
|
|
|