AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Obj. über Construcor übergeben und in priv. Var. speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Obj. über Construcor übergeben und in priv. Var. speichern

Ein Thema von scrat1979 · begonnen am 8. Jan 2010 · letzter Beitrag vom 8. Jan 2010
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

Obj. über Construcor übergeben und in priv. Var. speichern

  Alt 8. Jan 2010, 18:32
Hallo,

ich übergebe im Constructor einer Klasse ein Objekt. Nun möchte dieses in einer privaten Variable speichern um damit in der Klasse weiterzuarbeiten (andere Proceduren greifen dann über die private Variable darauf zu und verändern z.B. Farben einzelner Zellen).

Diese beiden "Varianten" funktionieren beide problemlos:

1. Version
Delphi-Quellcode:
 construcor Txyz.Create(GridName : TNextGrid);
 begin
   FPrivVariable := GridName;
 end;

2. Version
Delphi-Quellcode:
construcor Txyz.Create(GridName : TNextGrid);
 begin
   FPrivVariable := TNextGrid.Create(nil); // wird im Destruktor freigegeben
   FPrivVariable := GridName;
 end;
Frage: Welche der beiden Varianten sollte man verwenden (Vor- / Nachteile) bzw. warum funktioniert die 1. Version auch, obwohl FPrivVariable gar nicht "erstellt" wurde?

Danke im Voraus,
SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Obj. über Construcor übergeben und in priv. Var. speiche

  Alt 8. Jan 2010, 18:41
Die 1. Version ist richtig; die 2. Version erzeugt ein Speicherleck.
>>warum funktioniert die 1. Version auch, obwohl FPrivVariable gar nicht "erstellt" wurde?
Weil der Speicher für das Objekt der Klasse Txyz schon reserviert wurde, bevor der Constructor aufgerufen wird.
Generell ist der Ablauf bei Delphi so:
1.) Speicher für neues Objekt reservieren
2.) Speicher mit Nullen füllen
3.) Constructor aufrufen
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Obj. über Construcor übergeben und in priv. Var. speiche

  Alt 8. Jan 2010, 18:45
Zitat von sx2008:
Die 1. Version ist richtig; die 2. Version erzeugt ein Speicherleck.
>>warum funktioniert die 1. Version auch, obwohl FPrivVariable gar nicht "erstellt" wurde?
Weil der Speicher für das Objekt der Klasse Txyz schon reserviert wurde, bevor der Constructor aufgerufen wird.
Generell ist der Ablauf bei Delphi so:
1.) Speicher für neues Objekt reservieren
2.) Speicher mit Nullen füllen
3.) Constructor aufrufen
Im Prinzip klingt das für mich auch plausibel, ABER: Wenn ich z.B. innerhalb eines Objektes mit einer StringList arbeite und welche nicht durch den Konstruktor übergeben wird, dann muss ich diese ja im Konstruktor auch erstellen, um damit arbeiten zu können und den Speicher im Destruktor wieder freigeben. Warum? Wird der Speicher bei der Übergabe automatisch erzeugt, weil nur eine Referenz übergeben wird? Dann wäre es klar Danke!
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Obj. über Construcor übergeben und in priv. Var. speiche

  Alt 8. Jan 2010, 19:10
Objekt-Variablen sind in Delphi Zeiger (Referenzen).
Delphi-Quellcode:
constructor Txyz.Create(GridName : TNextGrid);
begin
  inherited Create; // nicht vergessen!!
  FPrivVariable := GridName;
end;
Das Objekt das im Parameter GridName übergeben wird schon existieren bevor ein Objekt der Klasse Txyz erzeugt wird.
Delphi-Quellcode:
var
  ng : TNextGrid;
  xyz : Txyz;
begin
  ng := TNextGrid.Create();
  xyz := Txyz.Create(ng);
  xyz.Irgendwas();
  ....
  xyz.Free;
  ng.Free; // Reihenfolge ist wichtig
Wichtig ist, dass das Objekt ng aus obigem Beispiel eine längere Lebensdauer als xyz hat!
fork me on Github
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#5

Re: Obj. über Construcor übergeben und in priv. Var. speiche

  Alt 8. Jan 2010, 19:21
Zitat von sx2008:
Objekt-Variablen sind in Delphi Zeiger (Referenzen).
Delphi-Quellcode:
constructor Txyz.Create(GridName : TNextGrid);
begin
  inherited Create; // nicht vergessen!!
  FPrivVariable := GridName;
end;
Das Objekt das im Parameter GridName übergeben wird schon existieren bevor ein Objekt der Klasse Txyz erzeugt wird.
Delphi-Quellcode:
var
  ng : TNextGrid;
  xyz : Txyz;
begin
  ng := TNextGrid.Create();
  xyz := Txyz.Create(ng);
  xyz.Irgendwas();
  ....
  xyz.Free;
  ng.Free; // Reihenfolge ist wichtig
Wichtig ist, dass das Objekt ng aus obigem Beispiel eine längere Lebensdauer als xyz hat!
Das heißt also, das FPrivVariable nur mit dem Wert der Adresse von ng belegt wird, während ng die Anfangsadresse der Objektes und damit des Speicherbereiches ist?
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Obj. über Construcor übergeben und in priv. Var. speiche

  Alt 8. Jan 2010, 20:01
Zitat von schöni:
Das heißt also, das FPrivVariable nur mit dem Wert der Adresse von ng belegt wird, während ng die Anfangsadresse der Objektes und damit des Speicherbereiches ist?
Ja.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Obj. über Construcor übergeben und in priv. Var. speiche

  Alt 8. Jan 2010, 22:48
>> Das Objekt das im Parameter GridName übergeben wird schon existieren bevor ein Objekt der Klasse Txyz erzeugt wird.
Dann habe ich es verstanden...

Der Rest ist mir klar Vielen Dank nochmals...
Michael Kübler
  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 08:34 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