Autor Beitrag
Jonas
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 13.05.03 16:40 
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:

ausblenden 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

ausblenden volle Höhe 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:

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


RAD Studio XE2
BeitragVerfasst: 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.

_________________
Ist Zeit wirklich Geld?
Jonas Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 13.05.03 17:34 
Titel: DANKE!
herzlichen dank!

funzt nun ohne probleme und ohne schutzverletzungen ;)