Autor Beitrag
Yvonne
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 23.01.03 13:53 
Hallo,

ich benötige eine Funktion, mit der ich ein neues Object B erzeuge und die Daten von Object A gleich hineinkopieren kann, um dann dieses Objekt in einer Objectliste zu speichern.

Bisher habe ich folgendes gemacht:


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
function MyClass.copy: MyClass; 
begin 
  result:= MyClass.create; 
  result.AttribA:= self.AttribA; 
  ... 
end;



Aufgerufen habe ich das dann immer mit


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
var Object1: MyClass; 
  MyList: TObjectList; 
begin   MyList:= TObjectList.create; 
  Object1:= MyClass.create;   MyList.Add(Object1.copy);   ...   Object1.free; 
  MyList.free; 
end;


Dies hat bisher immer ganz gut geklappt. Aber in einem Fall verliert self nach dem Aufruf von create seine Attributwerte.

Kann mir das jemand erklären? Und gibt es einen besseren Weg dies zu bewerkstelligen?
Danke schon mal,

Yvonne

Moderiert von user profile iconKlabautermann: Code-Tags hizugefügt & BBC Aktiviert.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 23.01.03 14:05 
Hi!

Bitte poste doch einmal genau den Code, der Schwierigkeiten macht.

Cu,
Udontknow
Yvonne Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 23.01.03 14:14 
in meinem vorherigen beispiel habe ich folgende zeile gehabt:

ausblenden Quelltext
1:
MyList.Add(Object1.copy)					


Angenommen Object1 hat AttribA = 5.

Wenn ich dann in die Copy-Funktion gehe, ist bevor ich die Zeile
ausblenden Quelltext
1:
result:= MyClass.create					

ausführe, auch noch der Wert richtig vorhanden.

Allerdings nach Ausführung der zeile
ausblenden Quelltext
1:
result:= myClass.create					

ist self.AttribA = 0.

Ich hoffe es ist jetzt etwas klarer geworden. Ich kann leider den original-SourceCode nicht hinzufügen, da das über x-Units läuft.

Mein Problem ist vor allem, daß der Code eine ganze zeit lang richtig läuft,
und dann erst - für mich nicht nachvollziehbar wann - den Fehler bringt.

Danke schon mal,
Yvonne

Moderiert von user profile iconKlabautermann: Code-Tags hizugefügt & BBC Aktiviert.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 23.01.03 14:19 
Hallo

ich versteh das nicht ganz:
ausblenden Quelltext
1:
2:
3:
 Object1:= MyClass.create; 
 MyList.Add(Object1.copy); 
 ... Object1.free;

warum nicht so,wenn du die Objektlist mit xxx.create(true) erstellst:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
 Object1:= MyClass.create; 
 object1.blabla:='blabla1'
 MyList.Add(Object1); 
 Object1:= MyClass.create; 
 object1.blabla:='blabla2'
 MyList.Add(Object1);

die Objekte werden automatisch wieder freigegeben

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Yvonne Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 23.01.03 14:23 
muß ich dann denn nicht innerhalb der Funktion irgendwann Object1
wieder freigeben?
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 23.01.03 14:33 
Yvonne hat folgendes geschrieben:
muß ich dann denn nicht innerhalb der Funktion irgendwann Object1
wieder freigeben?

Jein, kommt drauf an, wie du deine Objektliste created hast.
der booleanwert steht für ownobjekts.
wenn du true übergibst, macht das löschen die liste automatisch bei clear.
Wichtig ist dann aber, daß du auch immer ein neues Object erzeugst, daß du der liste hinzufügst.
würdest du dann das Object freigeben, ist auch dein Listeintrag pfutsch.
wenn du false übergibst, darfst du das löschen am Ende alles selber machen. Das steht aber genauer in der Onlinehilfe.

google mal nach Memproof, da kannst das gut nachvollziehen, ob der speicher freigegeben wird oder nicht.

hab jetzt hier nur D3 und muß n bissel raten :?

Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)


Zuletzt bearbeitet von Keldorn am Do 23.01.03 14:35, insgesamt 2-mal bearbeitet
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Do 23.01.03 14:33 
Hallo,

solange sich Deine Objekte von TObjekt ableiten und sie brav mit AddObjekt Deiner Liste zufügst, übernimmt das die Liste für Dich.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Yvonne Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 23.01.03 14:43 
Danke für die ersten Hinweise, ein bischen weiter komme ich jetzt schon. Wie gehe ich aber vor, wenn ich der Liste mehrere Objekte mit den selben Attributwerten hinzufügen möchte. Daraus ist nämlich diese ganze Geschichte entstanden:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
var MyObject: MyClass;
...

for i:= 0 to irgendwas do
begin
  MyList.Add(MyObject.Copy);
end;


Wenn ich das sonst ohne Copy mache, bekomme ich mächtigen Ärger, wenn ich die Liste lösche.

Danke nochmals,

Yvonne
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Do 23.01.03 14:56 
Hallo,

ausblenden Quelltext
1:
MyList.Add(MyObject.Create);					

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)