Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Function


Andreas_Sans - Mi 28.05.03 20:55
Titel: Function
da dieser teil sich immer wiederholt würde ich ihn gerne in eine prozedur oder function packen. aber leider weis ich nicht wie das geht. Kann mir jemand helfen ?


Quelltext
1:
2:
3:
4:
5:
      if (leer[i-8] <> 2) and (loes[i-8] = 0) then leer[i-8] := 1 else leer[i-8] := 3;
      if (leer[i-7] <> 2) and (loes[i-7] = 0) then leer[i-7] := 1 else leer[i-7] := 3;
      if (leer[i+1] <> 2) and (loes[i+1] = 0) then leer[i+1] := 1 else leer[i+1] := 3;
      if (leer[i+8] <> 2) and (loes[i+8] = 0) then leer[i+8] := 1 else leer[i+8] := 3;
      if (leer[i+9] <> 2) and (loes[i+9] = 0) then leer[i+9] := 1 else leer[i+9] := 3;


leer und loes sind arrays of integer


ErnestoChe - Mi 28.05.03 21:40

Hi,

ganz einfach. Da kein Wert zurückgegeben, sondern Werte verändert werden solltest du dich für eine Prozedur entscheiden. Das geht so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure meineProzedur;
begin
  if (leer[i-8] <> 2and (loes[i-8] = 0then leer[i-8] := 1 else leer[i-8] := 3
  if (leer[i-7] <> 2and (loes[i-7] = 0then leer[i-7] := 1 else leer[i-7] := 3
  if (leer[i+1] <> 2and (loes[i+1] = 0then leer[i+1] := 1 else leer[i+1] := 3
  if (leer[i+8] <> 2and (loes[i+8] = 0then leer[i+8] := 1 else leer[i+8] := 3
  if (leer[i+9] <> 2and (loes[i+9] = 0then leer[i+9] := 1 else leer[i+9] := 3;
end;


Der Aufruf erfolgt dann so:


Delphi-Quelltext
1:
meineProzedur;                    


MFG

- Ernesto -


Christian S. - Mi 28.05.03 21:52

Oder, damit die beiden Arrays sind global deklariert werden müssen, mach es doch so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure meineProzedur (loes : Array of Integer; VAR leer : Array of Integer);
begin
  if (leer[i-8] <> 2and (loes[i-8] = 0then leer[i-8] := 1 else leer[i-8] := 3
  if (leer[i-7] <> 2and (loes[i-7] = 0then leer[i-7] := 1 else leer[i-7] := 3
  if (leer[i+1] <> 2and (loes[i+1] = 0then leer[i+1] := 1 else leer[i+1] := 3
  if (leer[i+8] <> 2and (loes[i+8] = 0then leer[i+8] := 1 else leer[i+8] := 3
  if (leer[i+9] <> 2and (loes[i+9] = 0then leer[i+9] := 1 else leer[i+9] := 3;
end;


MfG,
Peter


ErnestoChe - Mi 28.05.03 21:55

Hallo nochmal,

der Vollständigkeit halber. Wenn deine Variablen keine globalen sind musst du sie natürlich noch innerhalb der Prozedur deklarieren.


Delphi-Quelltext
1:
2:
3:
4:
procedure meineProzedur; 
var
  leer, loes: array of Integer;
begin


oder als parameter übergeben:


Delphi-Quelltext
1:
procedure meineProzedur(leer, loes: array of Integer);                    


// Edit: Peter ist mir zuvorgekommen :wink:

MFG

- Ernesto -


TomT - Do 29.05.03 04:23

Könntest Du vielleicht posten worum es genau geht? Vielleicht gibts was viel einfacheres, weil sieht etwas umständlich aus (nich bös gemeint).

MFG TomT


AndyB - Do 29.05.03 09:39

TomT hat folgendes geschrieben:
sieht etwas umständlich aus



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
const 
  Nums: array[0..4of Integer = (-8, -7189);
var
  i: Integer;
begin
  for i := 0 to High(Nums) do
    if (leer[i-Nums[i]] <> 2and (loes[i-Nums[i]] = 0then leer[i-Nums[i]] := 1 else leer[i-Nums[i]] := 3
end;


Andreas_Sans - Do 29.05.03 17:46

die variable i soll auch in die procedure übernommen, aber wenn ich das dann so mache geht es nicht.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure meineProzedur (loes : Array of Integer;i : integer; VAR leer : Array of Integer;);
begin
  if (leer[i-8] <> 2) and (loes[i-8] = 0) then leer[i-8] := 1 else leer[i-8] := 3;
  if (leer[i-7] <> 2) and (loes[i-7] = 0) then leer[i-7] := 1 else leer[i-7] := 3;
  if (leer[i+1] <> 2) and (loes[i+1] = 0) then leer[i+1] := 1 else leer[i+1] := 3;
  if (leer[i+8] <> 2) and (loes[i+8] = 0) then leer[i+8] := 1 else leer[i+8] := 3;
  if (leer[i+9] <> 2) and (loes[i+9] = 0) then leer[i+9] := 1 else leer[i+9] := 3;
end;
[/code]


Christian S. - Do 29.05.03 18:00

Du überschüttest uns nicht gerade mit Informationen. Es wäre wirlkich hilfreich, wenn Du uns auch sagen könntest, was nicht klappt.


Andreas_Sans - Do 29.05.03 18:07

wenn ich versuche die prozedur mit meineprozedur; aufrufen will, schreibt delphi ich hätte nicht genügend wirkliche parameter


geronimo - Do 29.05.03 18:11

fehler:

procedure meineProzedur (loes : Array of Integer;i : integer; VAR leer : Array of Integer;);

die letzte variablendeklaration in einer klammer darf kein semikolon haben.

mfg geronimo


Christian S. - Do 29.05.03 18:11

Wenn Du keine Parameter angibst, ist das nicht verwunderlich. Du musst ja noch die entsprechenden Parameter an die Prozedur übergeben. Der Start muss so aussehen:


Delphi-Quelltext
1:
meineProzedur (MyLoes, My_I, MyLeer);                    


Wobei MyLoes, My_I, MyLeer Variablen der entsprechenden Typen sind.

MfG,
Peter


TomT - Do 29.05.03 18:59

Andreas_Sans hat folgendes geschrieben:
wenn ich versuche die prozedur mit meineprozedur; aufrufen will, schreibt delphi ich hätte nicht genügend wirkliche parameter


Du solltest beim Aufruf die Parameter angeben!


Andreas_Sans - Do 29.05.03 19:00

jetzt geht das aufrufen der prozedur, aber die geänderten Werte im array leer werden nicht zurückgegeben.

Quelltext
1:
2:
3:
4:
5:
  if (leer[i-8] <> 2) and (loes[i-8] = 0) then leer[i-8] := 1 else leer[i-8] := 3; 
  if (leer[i-7] <> 2) and (loes[i-7] = 0) then leer[i-7] := 1 else leer[i-7] := 3; 
  if (leer[i+1] <> 2) and (loes[i+1] = 0) then leer[i+1] := 1 else leer[i+1] := 3; 
  if (leer[i+8] <> 2) and (loes[i+8] = 0) then leer[i+8] := 1 else leer[i+8] := 3; 
  if (leer[i+9] <> 2) and (loes[i+9] = 0) then leer[i+9] := 1 else leer[i+9] := 3;


Christian S. - Do 29.05.03 19:03

Was meinst Du mit "zurückgegeben"? Eine Prozedur gibt nichts zurück. Die Werte werden geändert ... oder meintest Du, dass genau das nicht der Fall ist?


Andreas_Sans - Do 29.05.03 19:19

ich greife später auf die werte des arrays leer zu, normalerweis müssten sie nach de prozedur auf drei oder eins sein, das ist aber nicht der fall


Christian S. - Do 29.05.03 19:22

Dann poste bitte mal die komplette Implementation der Prozedur "meinProzedur" (oder wie auch immer die bei Dir heißt) und die Prozedur, in der diese aufgerufen wird. Es hilft auch oft, mit Einzelschritt während der Laufzeit durchzugehen und sich anzugucken, wie sich die Werte ändern bzw. dies unterlassen.


Andreas_Sans - Do 29.05.03 19:27

hier wird die prozedur aufgerufen (<---) :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
procedure TForm1.BitBtn1Click(Sender: TObject);
var i,j : integer;
begin
bitbtn1.Glyph := nil;

  IF loes[1] = 9 then begin
                         bitbtn1.Glyph.LoadFromFile('C:\Eigene Dateien\mine.bmp');
                         bitbtn65.Glyph.LoadFromFile('C:\Eigene Dateien\smily2.bmp');
                         bitbtn1.caption := '';
                         timer1.Enabled := false;

                      end
                 else bitbtn1.caption := inttostr(loes[1]);

  activecontrol := button2;

if loes[1] = 0 then begin

    leer[1] := 1;
y := 1;
repeat
 y := y+1;
 For i := 1 to 64 do begin

     if (i = 1and (leer[i] = 1then begin
x := i;
meineprozedur(leer,x,loes); <---
                                       end;

     if (i >= 2and (i <= 7and (leer[i] = 1then begin
x := i;
meineprozedur2(leer,x,loes);
                                                     end;

     if (i = 8and (leer[8] = 1then begin
x := i;
meineprozedur3(leer,x,loes);
                                       end;

     if ((i = 9or (i = 17or (i = 25or (i = 33or (i = 41or (i = 49)) and (leer[i] = 1then begin
x := i;
meineprozedur4(leer,x,loes);
                                                     end;

     if (((i > 9and (i < 16)) or ((i > 17and (i < 24)) or ((i > 25and (i < 32)) or ((i > 33and (i < 40)) or ((i > 41and (i < 48))or ((i > 49and (i < 56))) and (leer[i] = 1then begin
x := i;
meineprozedur5(leer,x,loes);
                                                     end;

     if ((i = 16or (i = 24or (i = 32or (i = 40or (i = 48or (i = 56)) and (leer[i] = 1then begin
x := i;
meineprozedur6(leer,x,loes);
                                                     end;

     if (i = 57and (leer[57] = 1then begin
x := i;
meineprozedur7(leer,x,loes);
                                       end;

     if (i >= 58and (i < 64and (leer[i] = 1then begin
x := i;
meineprozedur8(leer,x,loes);
                                                     end;

     if (i = 64and (leer[i] = 1then begin
x := i;
meineprozedur9(leer,x,loes);
                                        end;
                     end;
until y = 64;
                    end;

For i := 1 to 64 do begin
 if (leer[i] = 1and (loes[i] = 0then begin
   tbitbtn(FindComponent('bitbtn'+IntToStr(i))).visible := false;
                     end;

 IF (leer[i] = 3and ((loes[i] < 9and (loes[i] > 0)) then begin
   tbitbtn(FindComponent('bitbtn'+IntToStr(i))).caption := inttostr(loes[i]);
                                           end;
                    end;
   end;


und hier die dazugehörigen prozeduren :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
procedure meineProzedur (loes : Array of Integer;VAR x : integer; VAR leer : Array of Integer);
begin
      if (leer[2] <> 2and (loes[2] = 0then leer[2] := 1 else leer[2] := 3;
      if (leer[9] <> 2and (loes[9] = 0then leer[9] := 1 else leer[9] := 3;
      if (leer[10] <> 2and (loes[10] = 0then leer[10] := 1 else leer[10] := 3;
end;

procedure meineProzedur2 (loes : Array of Integer;VAR x : integer; VAR leer : Array of Integer);
begin
      if (leer[x-1] <> 2and (loes[x-1] = 0then leer[x-1] := 1 else leer[x-1] := 3;
      if (leer[x+1] <> 2and (loes[x+1] = 0then leer[x+1] := 1 else leer[x+1] := 3;
      if (leer[x+7] <> 2and (loes[x+7] = 0then leer[x+7] := 1 else leer[x+7] := 3;
      if (leer[x+8] <> 2and (loes[x+8] = 0then leer[x+8] := 1 else leer[x+8] := 3;
      if (leer[x+9] <> 2and (loes[x+9] = 0then leer[x+9] := 1 else leer[x+9] := 3;
end;

procedure meineProzedur3 (loes : Array of Integer;VAR x : integer; VAR leer : Array of Integer);
begin
      if (leer[7] <> 2and (loes[7] = 0then leer[7] := 1 else leer[7] := 3;
      if (leer[15] <> 2and (loes[15] = 0then leer[15] := 1 else leer[15] := 3;
      if (leer[16] <> 2and (loes[16] = 0then leer[16] := 1 else leer[16] := 3;
end;

procedure meineProzedur4 (loes : Array of integer;VAR x : integer; VAR leer : Array of integer);
begin
      if (leer[x-8] <> 2and (loes[x-8] = 0then leer[x-8] := 1 else leer[x-8] := 3;
      if (leer[x-7] <> 2and (loes[x-7] = 0then leer[x-7] := 1 else leer[x-7] := 3;
      if (leer[x+1] <> 2and (loes[x+1] = 0then leer[x+1] := 1 else leer[x+1] := 3;
      if (leer[x+8] <> 2and (loes[x+8] = 0then leer[x+8] := 1 else leer[x+8] := 3;
      if (leer[x+9] <> 2and (loes[x+9] = 0then leer[x+9] := 1 else leer[x+9] := 3;
end;


procedure meineProzedur5 (loes : Array of integer;VAR x : integer; VAR leer : Array of integer);
begin
      if (leer[x-9] <> 2and (loes[x-9] = 0then leer[x-9] := 1 else leer[x-9] := 3;
      if (leer[x-8] <> 2and (loes[x-8] = 0then leer[x-8] := 1 else leer[x-8] := 3;
      if (leer[x-7] <> 2and (loes[x-7] = 0then leer[x-7] := 1 else leer[x-7] := 3;
      if (leer[x+1] <> 2and (loes[x+1] = 0then leer[x+1] := 1 else leer[x+1] := 3;
      if (leer[x-1] <> 2and (loes[x-1] = 0then leer[x-1] := 1 else leer[x-1] := 3;
      if (leer[x+9] <> 2and (loes[x+9] = 0then leer[x+9] := 1 else leer[x+9] := 3;
      if (leer[x+8] <> 2and (loes[x+8] = 0then leer[x+8] := 1 else leer[x+8] := 3;
      if (leer[x+7] <> 2and (loes[x+7] = 0then leer[x+7] := 1 else leer[x+7] := 3;
end;

procedure meineProzedur6 (loes : Array of integer;VAR x : integer; VAR leer : Array of integer);
begin
      if (leer[x-8] <> 2and (loes[x-8] = 0then leer[x-8] := 1 else leer[x-8] := 3;
      if (leer[x-9] <> 2and (loes[x-9] = 0then leer[x-9] := 1 else leer[x-9] := 3;
      if (leer[x-1] <> 2and (loes[x-1] = 0then leer[x-1] := 1 else leer[x-1] := 3;
      if (leer[x+8] <> 2and (loes[x+8] = 0then leer[x+8] := 1 else leer[x+8] := 3;
      if (leer[x+7] <> 2and (loes[x+7] = 0then leer[x+7] := 1 else leer[x+7] := 3;
end;

procedure meineProzedur7 (loes : Array of integer;VAR x : integer; VAR leer : Array of integer);
begin
      if (leer[49] <> 2and (loes[49] = 0then leer[49] := 1 else leer[49] := 3;
      if (leer[50] <> 2and (loes[50] = 0then leer[50] := 1 else leer[50] := 3;
      if (leer[58] <> 2and (loes[58] = 0then leer[58] := 1 else leer[58] := 3;
end;


procedure meineProzedur8 (loes : Array of integer;VAR x : integer; VAR leer : Array of integer);
begin
      if (leer[x-1] <> 2and (loes[x-1] = 0then leer[x-1] := 1 else leer[x-1] := 3;
      if (leer[x+1] <> 2and (loes[x+1] = 0then leer[x+1] := 1 else leer[x+1] := 3;
      if (leer[x-7] <> 2and (loes[x-7] = 0then leer[x-7] := 1 else leer[x-7] := 3;
      if (leer[x-8] <> 2and (loes[x-8] = 0then leer[x-8] := 1 else leer[x-8] := 3;
      if (leer[x-9] <> 2and (loes[x-9] = 0then leer[x-9] := 1 else leer[x-9] := 3;
end;


procedure meineProzedur9 (loes : Array of integer;VAR x : integer; VAR leer : Array of integer);
begin
      if (leer[55] <> 2and (loes[55] = 0then leer[55] := 1 else leer[55] := 3;
      if (leer[56] <> 2and (loes[56] = 0then leer[56] := 1 else leer[56] := 3;
      if (leer[63] <> 2and (loes[63] = 0then leer[63] := 1 else leer[63] := 3;
end;


Christian S. - Do 29.05.03 20:40

Die Parameter beim Aufruf lauten bei Dir "leer, x, loes", deklariert sind die Parameter als "loes, x, leer". Kann also nicht klappen.

Ach ja, könntest Du in Deinem Posting die Code-Tags durch Delphi-Tags ersetzen? Erhöht die Lesbarkeit!

MfG,
Peter


Andreas_Sans - Do 29.05.03 23:38

Ganz großes DANKESCHÖN an alle die Geduld mit mir hatten und mir geholfen haben. Besonders PETER LUSTIG. Nochmals DANKE


Christian S. - Fr 30.05.03 09:29

Gern geschehen! Ist doch immer wieder schön, wenn sich jemand so sehr drüber freut! :D :D