AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList - AddObject-Problem

Ein Thema von emploi · begonnen am 29. Mär 2005 · letzter Beitrag vom 3. Sep 2015
Antwort Antwort
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
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: TStringList - AddObject-Problem

  Alt 29. Mär 2005, 13:51
property Vater : TMensch read FVater write FMutter;
Das sollte wohl "write FVater" heißen .

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

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

Re: TStringList - AddObject-Problem

  Alt 29. Mär 2005, 14:01
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!
  Mit Zitat antworten Zitat
emploi

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

Re: TStringList - AddObject-Problem

  Alt 29. Mär 2005, 14:12
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?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: TStringList - AddObject-Problem

  Alt 29. Mär 2005, 14:15
Die eine Zeil ändern
Code:
  [s]myList.Add(self.Kinder.Strings[i]); [/s]
  myList.Add(self.Kinder.Name);
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
emploi

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

Re: TStringList - AddObject-Problem

  Alt 29. Mär 2005, 14:18
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?!
  Mit Zitat antworten Zitat
general-e

Registriert seit: 1. Jun 2005
Ort: Kamen
5 Beiträge
 
Delphi XE Enterprise
 
#7

AW: TStringList - AddObject-Problem

  Alt 3. Sep 2015, 09:06
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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