Autor Beitrag
speck12
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 05.09.07 21:30 
Hallo allerseits.
Ich habe ein Problem beim Zugriff auf eine Liste, die dynamisch in eine andere Liste erzeugt wurde.

Hier der Quelltext, damit man sich das besser Vorstellen kann :

ausblenden volle Höhe 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:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
unit Tower_Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type TTower = class(TBitmap)
  public
   x_tower         : Integer;
   y_tower         : Integer;
   position        : TPoint ;
   range           : Integer;
   damage          : Integer;
   frequency       : Integer;
   color           : TColor ;
   projektil_liste : TList  ;
   constructor create(x,y,t_range,t_damage,t_frequency : integer ; Farbe : TColor);
   function creep_in_range(creep_pos : TPoint) : Boolean;
   function schiessen(creep_pos : TPoint) : TPoint;
   destructor Destroy(); override ;
  end;

type TBullet = class(TBitmap)
  public
   range    : Integer;
   damage   : Integer;
   position : TPoint ;
   constructor Create(Breite,Hoehe,range,damage : integer; FilePathOfBMP : String);
   destructor Destroy(); override;
  end;

implementation

uses Main;

constructor TTower.create(x,y,t_range,t_damage,t_frequency : integer ; Farbe : TColor);
 begin
  Inherited Create;

  projektil_liste := TList.Create;

  Width    := 20;
  Height   := 20;
  x_tower  := x;
  y_tower  := y;
  color    := Farbe ;
  damage   := t_damage;
  frequency:= t_frequency;
  range    := t_range;
   with Canvas do
    begin
     Draw(0,0,main.Form1.grafik_sammlung.tower_bmp);
    end;
  end;

function TTower.creep_in_range(creep_pos : TPoint) : Boolean;
 var tm : TPoint;
      d : double;
  begin
   tm.X := abs(x_tower + (Width  DIV 2));
   tm.Y := abs(y_tower + (Height DIV 2));

   d := SQRT(SQR(abs(creep_pos.X - tm.X)) + SQR(abs(creep_pos.Y - tm.Y)));

   if d <= range then
    Result := true
   else
    Result := false;
  end;

function TTower.schiessen(creep_pos : TPoint): TPoint;
 var temp,x,y : integer;
  begin
   projektil_liste.Add(TBullet.Create(5,5,50,damage,'\bullet1.bmp'));
   temp := projektil_liste.Count - 1;
   Result.X := creep_pos.X - position.X;
   Result.Y := creep_pos.Y - position.Y;
  end;


destructor TTower.Destroy();
 begin
  Inherited Destroy;
 end

constructor TBullet.Create(Breite,Hoehe,range,damage : Integer; FilePathOfBMP : String);
 begin
  Inherited Create;
  Width  := Breite;
  Height := Hoehe ;
  LoadFromFile(Main.Form1.grafik_sammlung.stammpfad + FilePathOfBMP);
 end;

Destructor TBullet.Destroy();
 begin
  Inherited Destroy;
 end;
end.

In dieser Unit gibt es 2 Klassen,
-TTower
-TBullet
TTower hat eine TList "projektil_liste", in der TBUllets dynamisch erzeugt werden.
TTower allerdings wird auch dynamisch erzeugt und in eine andere Liste geschrieben, die sich in der MainUnit befindet und so befüllt wird:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button2Click(Sender: TObject);
  begin
   tower_liste.Add(TTower.create(x_tower,y_tower,t_range,t_damage,t_frequency,t_farbe));
   selected_t := tower_liste.Count - 1;
   t_ja := true;
  end;

Nun möchte ich aus einer dritten Unit aus, auf die "projektil_liste" zugreifen, kann das aber nur über die tower_liste machen... (in den geschweiften Klammern soll darauf zugegriffen werden)
ausblenden volle Höhe 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:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit Hintergrund_unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls ;

type THintergrund = class(TBitmap)
  public
   Hintergrund_Farbe : TColor;
   Strasse_Farbe     : TColor;
   constructor create(Breite,Hoehe : integer; Farbe,Strasse : TColor);
   procedure Refresh;
   procedure Strasse_Refresh;
   destructor destroy(); override;
  end;
implementation

uses Main,Tower_unit,Creep_unit;

constructor THintergrund.create(Breite,Hoehe : integer;Farbe,Strasse : TColor);
 begin
  Inherited Create;
  Width  := Breite;
  Height := Hoehe ;
  Hintergrund_Farbe  := Farbe  ;
  Strasse_Farbe      := Strasse;
   with Canvas do
    begin
     Brush.Color := Farbe;
     Pen.Color   := Farbe;
     Rectangle(0,0,width,height);
     Brush.Color := Strasse;
     Pen.Color   := Strasse;
     Rectangle(60,70,100,height) ;
     Rectangle(100,70,360,110)   ;
     Rectangle(360,70,400,300)   ;
     Rectangle(400,260,width,300);
    end;
 end;

procedure THintergrund.Strasse_Refresh;
 begin
  with Canvas do
  begin
   Brush.Color := Strasse_Farbe;
   Pen.Color   := Strasse_Farbe;
   Rectangle(60,70,100,height) ;
   Rectangle(100,70,360,110)   ;
   Rectangle(360,70,400,300)   ;
   Rectangle(400,260,width,300);
  end;
 end;

procedure THintergrund.Refresh;
var i,n,max_bullet : integer;
begin
 with Canvas do
  begin
   Brush.Color := Hintergrund_Farbe;
   Pen.Color   := Hintergrund_Farbe;
   Rectangle(0,0,width,height);
   Brush.Color := Strasse_Farbe;
   Pen.Color   := Strasse_Farbe;
   Rectangle(60,70,100,height) ;
   Rectangle(100,70,360,110)   ;
   Rectangle(360,70,400,300)   ;
   Rectangle(400,260,width,300);
    for i := 0 to Main.Form1.tower_liste.Count - 1 do
     begin
      Draw(TTower(Main.Form1.tower_liste.Items[i]).x_tower,TTower(Main.Form1.tower_liste.Items[i]).y_tower,TTower(Main.Form1.tower_liste.Items[i]));
       {for n := 0 to Main.Form1.tower_liste.items[i].projektil_liste.count - 1 do
        begin
         Draw(TBullet(Main.Form1.tower_liste.Items[i].projektil_liste.Items[n]).position.x,TBullet(Main.Form1.tower_liste.Items[i].projektil_liste.Items[n]).position.Yield,TBullet(Main.Form1.tower_liste.Items[i].projektil_liste.Items[n]));}

     end;
    for i := 0 to Main.Form1.creep_liste.Count - 1 do
     begin
      if Main.Form1.creep_liste.Items[i] <> nil then
       Draw(TCreep(Main.Form1.creep_liste.Items[i]).x_Creep,TCreep(Main.Form1.creep_liste.Items[i]).y_Creep,TCreep(Main.Form1.creep_liste.Items[i]));
     end;

 end;
end;







destructor THintergrund.destroy();
 begin
  inherited destroy;
 end;
end.

Das geht so jedoch nicht, da er einen Record,Object oder Klassentyp fordert.

Vielleicht kann mir jemand sagen, wie ich anders auf diese Liste zugreifen kann?
mfg