Autor Beitrag
markus_5a
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 24.03.05 10:35 
[edit] sorry, hab das im falschen forum gepostet.... [/edit]

zuerstmal hallo zusammen, da ich hier ja neu bin und dann mal gleich zu meinem problem :D

bin ein delphi anfaenger und moechte verschachtelte listen machen (tlist in einer tlist);

wenn ich die erste list erstelle funktioniert es ja noch problemlos, erstelle ich dann allerdings die "unter-liste" greift delphi immer auf eine falsche adresse zu...

so hier schnippsel ich grad mal die entsprechenden code-teile zusammen. hoffe mir passiert dabei kein fehler...


hier mal die deklarierungen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  pelements = ^telements;

  telements = class

    subele1: tlist;
    subele2: tsubele2;
  end;

var
  list_elements: Tlist;


hier erstell ich die erste liste..
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure initialize_element_lists();
begin
  list_elements := Tlist.create;
  list_elements.Capacity := 200;
end;


dann in der funktion:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  createelement: pelements;
begin

  //Create new shaft
  new(createelement);

  //create list for shaft part
  createelement^.subele1 := TList.Create; //diese zeile ist die ursache...


hier muss ich irgendetwas falsch gemacht haben, dass ich immer den fehler mit der adresse bekomm. allerdings seh ich den fehler nicht.

waer nett wenn mir jemand weiterhelfen koennte.

danke und scohenen tag

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Do 24.03.2005 um 11:59
Jailbird
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 127

Windows XP Pro SP2
Delphi 7 Professional
BeitragVerfasst: Do 24.03.05 11:55 
Mach die TElements mal so. Du kannst von aussen her weiterhin myele.subele1 brauchen

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:
TElements = class(TObject)
private
  Fsubele1: TList;
  Fsubele2: TSubele2;
  procedure Setsubele1(const Value: TList);
  procedure Setsubele2(const Value: TSubele2);
public
  constructor Create;
  destructor Destroy: override;
  property subele1: TList read Fsubele1 write Setsubele1;
  property subele2: TSubele2 read Fsubele2 write Setsubele2;
end;

constructor TElements.Create;
begin
  inherited;
  Fsubele1 := TList.Create;
  Fsubele2 := TSubele2.Create;
end;

destructor TElements.Destroy;
begin
  if Fsubele1 <> nil then Fsubele1.Free;
  if Fsubele2 <> nil then Fsubele2.Free;
  inherited;
end;

procedure TElements.Setsubele1(const Value: TList);
begin
  Fsubele1 := Value;
end;

procedure TElements.Setsubele2(const Value: TSubele2);
begin
  Fsubele2 := Value;
end;
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Do 24.03.05 12:07 
Da TElements eine Class ist, kannst du diese nicht mit New erzeugen! wenn du aus telements = class mal ein telements = record machst, sollte das funktionieren :)

Oder du machst es so:
Klassen müssen über einen Konstruktor erzeugt werden, also so wie bei TList, etwa so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  elElements: TElements;
begin
  elElements := TElements.Create;
  elElements.subele1 := TList.Create;
end;




MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
markus_5a Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 24.03.05 13:36 
zu beginn hatte ich records verwendet...aber mit diesen kann man ja keine forward declarations machen, oder hab ich das was verpasst?

in dem fall werd ich mal eure vorschlaege ausprobieren und mich dann wieder melden :)
markus_5a Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 24.03.05 14:33 
ah ja, merce....hab einfach das create vergessen.

new stimmt schon, da createelement ein pointer ist, hab da leider auch das p vor dem variablen-namen nicht hingeschrieben was zur unuebersichtlichkeit beitraegt...