Einzelnen Beitrag anzeigen

emploi

Registriert seit: 21. Jun 2004
Ort: Ilmtown
40 Beiträge
 
Delphi 7 Enterprise
 
#1

TStringList - AddObject-Problem

  Alt 29. Mär 2005, 13:41
Hi Leute!

Ich hab folgendes Problem. Ich schreibe in 2 Tagen eine Delphi Klausur in der Uni
und wollt mal so ne Übungsaufgabe programmieren. Problem ist das ich immer eine Zugriffsverletzung
bei dem AddObject in der Funktion "erzeuge_kind" bekomme.

Vielleicht könnte mir einer sagen wo der fehler steckt?

Mfg emploi

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

    TMensch = class
    private
      FName : String;
      FGebdatum : String;
      FMaennlich : Boolean;
      FVater : TMensch;
      FMutter : TMensch;
    protected
      Kinder : TStringList;
      Constructor Create( pName: String);
      Destructor destroy;
      property Vater : TMensch read FVater write FMutter;
      property Mutter: TMensch read FMutter write FMutter;
      property Maennlich : boolean read FMaennlich write FMaennlich;
      property Name : String read FName;
      property Geburtsdatum: String read FGebdatum;
      function erzeuge_kind(elter: TMensch; name: String): TMensch;
      function ermittle_geschwister: TStringlist;
  end; // Ende Class TMensch

var
  Form1: TForm1;
  Vater: TMensch;
  Mutter: TMensch;
  Kind: TMensch;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
     Vater := TMensch.Create('Steffen');
     Vater.Maennlich := true;
     Mutter := TMensch.Create('Kathrin');
     Mutter.Maennlich := False;
     Kind := Mutter.erzeuge_kind(Vater,'Philipp');
end;

Constructor TMensch.Create( pName: String);
begin
  FName := pName;
  FGebdatum := DateToStr(Date);
end;

Destructor TMensch.Destroy;
var i: Integer;
    myMensch: TMensch;
begin
    IF self.Kinder.Count <> 0 THEN
      FOR i:=0 TO self.Kinder.Count-1 DO
      BEGIN
        myMensch := self.Kinder.Objects[i] as TMensch;
        IF myMensch.Vater = self THEN
          myMensch.Vater := NIL
        ELSE
          myMensch.Mutter := NIL;
      END;
    self.Free;
end;

function TMensch.ermittle_geschwister: TStringlist;
var myList: TStringList;
    i: Integer;
begin
    IF self.Kinder.Count = 0 THEN
    BEGIN
      ermittle_geschwister := Nil;
      exit;
    END;
    TRY
       myList := TStringList.Create;
       FOR i:=0 TO self.Kinder.Count-1 DO
          myList.Add(self.Kinder.Strings[i]);
    Except ON E: Exception DO
    END;
    result := myList;
    myList.Free;
end;

function TMensch.erzeuge_kind(elter: TMensch; name: String): TMensch;
var Kind: TMensch;
begin
  IF ((elter = NIL) OR (self.Maennlich = elter.Maennlich)) THEN Kind := NIL
  ELSE
  BEGIN
     Kind := TMensch.Create(name);
     Kind.Maennlich := true;
     Kind.Vater := elter;
     Kind.Mutter := self;
     elter.Kinder.AddObject(name,Kind);
     self.Kinder.AddObject(name,Kind);
  END;
  result := Kind;
end;

end.
  Mit Zitat antworten Zitat