Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList - AddObject-Problem (https://www.delphipraxis.net/43114-tstringlist-addobject-problem.html)

emploi 29. Mär 2005 13:41


TStringList - AddObject-Problem
 
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.

Khabarakh 29. Mär 2005 13:51

Re: TStringList - AddObject-Problem
 
Delphi-Quellcode:
property Vater : TMensch read FVater write FMutter;
:lol: :lol:
Das sollte wohl "write FVater" heißen :wink: .

[edit] Du musst die StringList im Konstruktor selbst erzeugen.
[edit2] und deine bösen globalen Variablen (:wink: , verschieb sie in den private-Abschnitt der Form) wieder freigeben, wobei das ja nicht der entscheidende Fehler ist.

emploi 29. Mär 2005 14:01

Re: TStringList - AddObject-Problem
 
hej!

danke dir!

super es funktioniert :)

Die pösen globalen variablen sind nur fürs schnelle testen.
Das mit dem FVater hab ich doch tatsächlich ständig überlesen.
und das mit dem StringList erzeugen ist auch logisch .. *ankopfhau*

Trotzdem vielen dank nochmal!

emploi 29. Mär 2005 14:12

Re: TStringList - AddObject-Problem
 
Kommando zurück :(

Ganz funktioniert es irgendwie noch nicht.

Delphi-Quellcode:
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');
    showmessage(Vater.ermittle_geschwister.Text);
end;
sollte ja theoretisch den Namen Philipp ausgeben. Bin auch mal mit einzelaufforderung durch gegangen. irgendwie steht in der Kinder Liste vom Vater und von der Mutter nix drin. Aber "Count" ist 1 ?!

bin ich jetzt ganz doof?

sakura 29. Mär 2005 14:15

Re: TStringList - AddObject-Problem
 
Die eine Zeil ändern ;)
Code:
  [s]myList.Add(self.Kinder.Strings[i]); [/s]
  myList.Add(self.Kinder.Name);
...:cat:...

emploi 29. Mär 2005 14:18

Re: TStringList - AddObject-Problem
 
hm.

kannste das kurz erläutern?
Aber erstmal vorab:

Die Eigenschaft .Name ist unbekannt. Es gibt höchstens .Names[index].

Aber was ich nicht verstehe: Ich dachte AddObject(string,object) fügt
einen String in die StringListe ein und verknüpft ein Object in der Object Liste
damit?!

general-e 3. Sep 2015 09:06

AW: TStringList - AddObject-Problem
 
Hallo,

auch, wenn das Thema schon seeeehhhr alt ist, wollen wir ja für alle spätern Leser eine Lösung bereitstellen:

In ermittle_geschwister wird eine Stringlist mylist erzeugt, an result zugewiesen und wieder freigegeben. Da Objekte immer als Referenz übergeben werden, wird damit auch das result freigegeben, da es die Stringliste nur einmal gibt.
Du musst das Freigeben des Ergebnisses immer außen machen:

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

procedure TForm1.Button1Click(Sender: TObject);
var geschwister:Stringlist;
begin
     Vater := TMensch.Create('Steffen');
     Vater.Maennlich := true;
     Mutter := TMensch.Create('Kathrin');
     Mutter.Maennlich := False;
     Kind := Mutter.erzeuge_kind(Vater,'Philipp');
     geschwister := Vater.ermittle_geschwister;
     if assigned(geschwister) then
     try
       showmessage(geschwister.Text);
     finally
       freeAndNil(geschwister);
     end;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz