![]() |
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. |
Re: TStringList - AddObject-Problem
Delphi-Quellcode:
:lol: :lol:
property Vater : TMensch read FVater write FMutter;
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. |
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! |
Re: TStringList - AddObject-Problem
Kommando zurück :(
Ganz funktioniert es irgendwie noch nicht.
Delphi-Quellcode:
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 ?!
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; bin ich jetzt ganz doof? |
Re: TStringList - AddObject-Problem
Die eine Zeil ändern ;)
Code:
...:cat:...
[s]myList.Add(self.Kinder.Strings[i]); [/s]
myList.Add(self.Kinder.Name); |
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?! |
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 16:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz