Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Instanzen einer Klasse in einer Funktion direkt bearbeiten


Jonas - Di 13.05.03 16:40
Titel: Instanzen einer Klasse in einer Funktion direkt bearbeiten
Problem:

Ich habe ein mittels einer Klasse mehrere Objekte erstellt.

nun wird diese Objekt an eine function uebergeben und dort bearbeitet. die function gibt aber nur boolean zurueck, da ich die aussage benoetige, ob sie korrekt ausgefuehrt wurde.

das objekt, was in der funktion jedoch geaendert (bzw. per create erstellt wird, da vorher nur die var uebergeben wird) ist nachher nur mit nil werten gefuellt.

Die Klasse und die global vars:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
type
  TSchiff = class
    xwert:array[0..3] of integer;
    ywert:array[0..3] of integer;
    typ:Integer;
    summe:Integer;
    versenkt:boolean;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

...


var
  Form1: TForm1;
  schiffanz: Integer;
  schiffe: array[1..4] of array[1..4] of TSchiff;
  cschiffe: array[1..4] of array[1..4] of TSchiff;


die function in der das schiff erzeugt wird


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:
function SetzeSchiff(grid: TStringGrid;Schiff: TSchiff; typ,x,y,dir:Integer):boolean;
var i, n :Integer;
begin
  Schiff := TSchiff.Create;
  Case dir of
  0:
  begin
    if (x+typ-1<=10) then
    begin
      for i := 0 to typ-1 do
      begin
        Schiff.ywert[i] := y;
        Schiff.xwert[i] := x+i;
        if grid.Cells[Schiff.xwert[i],Schiff.ywert[i]] = '' then
         begin
          grid.Cells[Schiff.xwert[i],Schiff.ywert[i]] := inttostr(typ);
          Result := true;
         end
        else
         begin
           for n := i-1 downto 0 do
            grid.Cells[Schiff.xwert[n],Schiff.ywert[n]] := '';
          ShowText('Schiff kann an dieser Stelle nicht gesetzt werden', 1);
          Result := false;
          break;
         end;
      end;
    end
    else
    begin
      ShowText('Schiff kann an dieser Stelle nicht gesetzt werden', 1);
      Result := false;
    end;
  end;
  1:
  begin
    if (y+typ-1<=10) then
    begin
      for i := 0 to typ-1 do
      begin
        Schiff.ywert[i] := y+i;
        Schiff.xwert[i] := x;
        if grid.Cells[Schiff.xwert[i],Schiff.ywert[i]] = '' then
         begin
          grid.Cells[Schiff.xwert[i],Schiff.ywert[i]] := inttostr(typ);
          Result := true;
         end
        else
         begin
           for n := i-1 downto 0 do
            grid.Cells[Schiff.xwert[n],Schiff.ywert[n]] := '';
          ShowText('Schiff kann an dieser Stelle nicht gesetzt werden', 1);
          Result := false;
          break;
         end;
      end;
    end
    else
    begin
      ShowText('Schiff kann an dieser Stelle nicht gesetzt werden', 1);
      Result := false;
    end;
  end;
  end;
end;


der aufruf:


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:
procedure TForm1.sgrid1Click(Sender: TObject);
var dir: Integer;
begin
  if rw.Checked then
    dir := 0
  else
    dir := 1;
  case schiffanz of
   0: if SetzeSchiff(sgrid1, schiffe[1][1], 1, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   1: if SetzeSchiff(sgrid1, schiffe[1][2], 1, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   2: if SetzeSchiff(sgrid1, schiffe[1][3], 1, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   3: if SetzeSchiff(sgrid1, schiffe[1][4], 1, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   4: if SetzeSchiff(sgrid1, schiffe[2][1], 2, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   5: if SetzeSchiff(sgrid1, schiffe[2][2], 2, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   6: if SetzeSchiff(sgrid1, schiffe[2][3], 2, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   7: if SetzeSchiff(sgrid1, schiffe[3][1], 3, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   8: if SetzeSchiff(sgrid1, schiffe[3][2], 3, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then schiffanz := schiffanz + 1;
   9: if SetzeSchiff(sgrid1, schiffe[4][1], 4, sgrid1.Selection.Left, sgrid1.Selection.Top, dir) then
        begin
          schiffanz := schiffanz + 1;
          ShowText('',0);
          //sgrid1.Selection.Left := 0;
          //sgrid1.Selection.Top := 0;
          sgrid1.Enabled := False;
        end;
  end;
end;


klappt bis dahin ganz gut von der ausgabe her, fehler gibts zumindest nicht.

erst wenn ich versuche auf ein element zuzugreifen, z.b. schiffe[1][1], dann kommt ne schutzverletzung und das komplette schiffe array enthaelt nil werte...


AndyB - Di 13.05.03 17:17

Der Funktionskopf braucht nur eine kleine Änderung.

function SetzeSchiff(grid: TStringGrid;var Schiff: TSchiff; typ,x,y,dir:Integer):boolean;


Das var muss hier benutzt werden, da der Zeiger Schiff durch Schiff := TSchiff.Create verändert wird.


Jonas - Di 13.05.03 17:34
Titel: DANKE!
herzlichen dank!

funzt nun ohne probleme und ohne schutzverletzungen ;)