Autor Beitrag
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Mo 08.02.10 23:23 
Netten Abend allerseits,

ich habe momentan ne Prozedur, die auch soweit funktioniert:

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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?

ausblenden 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];
  // hier iwie den Boolean, aber wie?
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 09.02.10 09:17 
Na, mit dem Boolean-Feld gibst Du einfach zurück, ob die letzte Bedinung erfüllt wurde:

ausblenden 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; // 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)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.