Entwickler-Ecke

Sonstiges (Delphi) - Lists in eine TList


speck12 - Mi 05.09.07 21:30
Titel: Lists in eine TList
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 :


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:

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)

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