Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - array einer klasse in funktion ansprechen


reptile - Mo 06.04.09 16:51
Titel: array einer klasse in funktion ansprechen
folgendes problem:

ich habe in meinem programm zwei klassen A und B. die klasse A besitzt als variable ein "array[0..5] of B"

nun will ich eine funktion schreiben, die als rückgabewert ein objekt der klasse A liefert. nur scheint es mir leider nicht möglich zu sein, in dieser funktion die felder in dem "array[0..5] of B" zu ändern, bzw überhaupt festzulegen. sobald ich das versuche erscheint eine fehlermeldung. alle anderen variablen von A lassen sich problemlos festlegen in der funktion, nur das array lässt sich nicht ansprechen. geht sowas etwa gar nicht ?

das sind die klassen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  TMovement = class(TObject)
    ID : integer;
    counter : integer;
    factor1, factor2, degree : real;
  end;
  TEnemy = class(TObject)
    x,z : real;
    movementlist : array[0..5of TMovement;
    time, hp, move : integer;
  end;


das ist die funktion:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function create_weak_fighter(hp, time : integer; x,z : real) : TEnemy;
begin
create_weak_fighter := TEnemy.Create;
create_weak_fighter.x := x;
create_weak_fighter.z := -15;
create_weak_fighter.time := time;
create_weak_fighter.hp := hp;
create_weak_fighter.move := 0;
create_weak_fighter.movementlist[0].ID := 2;               << hier erscheint der fehler
create_weak_fighter.movementlist[0].counter := 50;
create_weak_fighter.movementlist[1].ID := 1;
end;


über die bedeutung der variablen braucht ihr euch keine gedanken zu machen..


Narses - Mo 06.04.09 16:59

Moin!

user profile iconreptile hat folgendes geschrieben Zum zitierten Posting springen:
falls gewünscht kann ich auch noch den entsprechenden code posten
Es wäre sicher sinnvoll, mal die Deklatation deiner Klassen zu sehen. :nixweiss:

cu
Narses


JayEff - Mo 06.04.09 17:26

Ich weiß nicht, wie dein Konstruktor von TEnemy aussieht, aber wenn du ihn nicht verändert hast, fehlt die Speicherreservierung für TMovement:create_weak_fighter.movementlist[0] := TMovement.Create;
Das kannst du aber im Konstruktor von TEnemy erledigen, wenn du sowieso alle 5 TMovements brauchst, oder aber im setter von Movementlist:

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:
  TEnemy = class(TObject)
    x,z : real;
    movementlist : array[0..5of TMovement;
    time, hp, move : integer;
  public {?}
    constructor Create;  
  end;


constructor TEnemy.Create;
var
  i : Integer;
begin
  inherited Create;
  for i := 0 to 5 do
    movementlist[i] := TMovement.Create; //bin mir jetzt grad nicht ganz sicher, ob ich das hier korrekt anspreche...
end;

{oder (so ähnlich ... >_> )}

TMovementList = array[0 .. 5of TMovement;

TEnemy = class(TObject)
    x,z : real;
    time, hp, move : integer;
  private {?}
    FMovementlist : TMovementList;
    procedure SetMovement(X: Integer; Value: TMovement);
  public {?}
    property Movementlist[X : Integer] : TMovementList read FMovementlist write SetMovement;
  end;

procedure TEnemy.SetMovement(X: Integer; Value: TMovement);
begin
  if not Assigned(FMovementlist[X]) then
    FMovementlist[X] := TMovement.Create;

  FMovementlist[X].Assign(Value); //Assign musst du dir für TMovement noch selbst schreiben.
  //Assign soll die Werte von Value in das Movementobjekt kopieren. NICHT sowas schreiben:
  //FMovementlist[X] := Value;
  //Hier würde nämlich der Pointer von Value kopiert werden und das könnte unter Umständen Probleme geben.
end;

Mit der zweiten Methode hab ich keinerlei Erfahrung, das hab ich jetzt alles aus den bereits in Delphi vorliegenden Klassen entnommen (Siehe z.B. TCanvas.Pixels und dessen Setter/Getter oder TPicture.SetGraphic). Die erste ist sicher einfacher zu implementieren.
Oder du nimmst halt einfach das, was ich zu allererst gesagt hab ;)


reptile - Mo 06.04.09 17:34

vielen dank, das hat geholfen (die erste methode)

jetzt im nachhinein ist mir das komplett klar weshalb das nicht funktionieren konnte, aber ich hab mal wieder den wald vor lauter bäumen nicht gesehen..