AGB  ·  Datenschutz  ·  Impressum  







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

TObject kopieren und zuweisen

Ein Thema von helen · begonnen am 16. Jun 2004 · letzter Beitrag vom 13. Jul 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#11

Re: TObject kopieren und zuweisen

  Alt 16. Jun 2004, 14:47
hallo,

was spricht eigentlich gegen:
Delphi-Quellcode:
s := tMember.Create;
s.zahl := 12;

p := tMember(s).Create;

// nun ist p.zahl=12

...
p.zahl := 12589;

gruß rené
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: TObject kopieren und zuweisen

  Alt 16. Jun 2004, 14:59
Moin!

Zitat von ibp:
hallo,

was spricht eigentlich gegen:
Delphi-Quellcode:
s := tMember.Create;
s.zahl := 12;

p := tMember(s).Create;

// nun ist p.zahl=12

...
p.zahl := 12589;

gruß rené
Nicht Funktionstüchtigkeit?

TMember(s) macht einen direkten TypeCast, der aber unsinnig ist, da s schon von dem Typ TMember ist. Und s.Create ist zwar witzig, aber was sollte das bringen? Eine neue Instanz wird nicht angelegt und die Variablen der Klassen werden auch nicht kopiert...

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#13

Re: TObject kopieren und zuweisen

  Alt 16. Jun 2004, 15:08
Zitat von Muetze1:
TMember(s) macht einen direkten TypeCast, der aber unsinnig ist, da s schon von dem Typ TMember ist.
ok sehe ich ein

Zitat von Muetze1:
Und s.Create ist zwar witzig, aber was sollte das bringen? Eine neue Instanz wird nicht angelegt und die Variablen der Klassen werden auch nicht kopiert...
bei mir schon, es funzt mit s.Create!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: TObject kopieren und zuweisen

  Alt 16. Jun 2004, 17:13
Moin!

Zitat von ibp:
Zitat von Muetze1:
Und s.Create ist zwar witzig, aber was sollte das bringen? Eine neue Instanz wird nicht angelegt und die Variablen der Klassen werden auch nicht kopiert...
bei mir schon, es funzt mit s.Create!
Da ich das nicht glauben kann, habe ich das selber mach nachgeschrieben...

Also:

Code:
p := s.Create
ruft nochmal direkt den Constructor der Klasse auf - besser: von der Instanz von s. Da s als Instanz schon vorhanden ist, ergo die Klasse schon angelegt ist, gibt der Constructor die Instanzenadresse von s zurück. Mit anderen Worten der obige Konstrukt ist das gleiche wie p := s; - mit anderen Worten s.Free; geht noch aber p.Free; geht in die Hose (ungültige Zeiger Op). Du instanziierst nix, sondern du bekommst die Klasse s zurückgeliefert, ergo keine 2. Instanz und keine Kopie der Klasse...

Mein TestProgramm ist im Anhang....

MfG
Muetze1
Angehängte Dateien
Dateityp: dpr project29.dpr (756 Bytes, 10x aufgerufen)
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: TObject kopieren und zuweisen

  Alt 13. Jul 2006, 13:26
Hallöchen!
Ich habe quasi das selbe problem )
nur stellt es sich als noch etwas schwieriger hervor wenn man keine property auf die member variable hat sondern nur die member. also anstatt:

Zitat von Garby:
Hallo,

was du suchst ist in Delphi mit der Methode Assign gelöst worden.
Diese Methode wird allerdings erst in TPersistent eingeführt.

Wenn du dein Objekt unbedingt von TObject ableiten willst, kannst du dir das Assign ja nachprogrammieren:
Delphi-Quellcode:
type TMember = class(TObject)
  private
    FZahl: Integer;
public
  procedure Assign(o: TMember);
  property Zahl: Integer read FZahl write FZahl;
end;
das hier:

Delphi-Quellcode:
type TMember = class(TObject)
  private
    FZahl: Integer;
public
  procedure Assign(o: TMember);
// property Zahl: Integer read FZahl write FZahl;
end;
jemand davon einen lösungsansatz? ich habe mir mal gedanken drüber gemacht.. man könnte z.B. eine memento klasse erstellen, was ich aber für sehr umständlich halte..
würde dann so aussehen...

Delphi-Quellcode:

type
  TMementoMember = class( TObject )
  private
    FZahl : Integer;
  public
    property Zahl : integer read FZahl write FZahl;
end;

//..........

type
  TMember = class(TObject)
  private
    FZahl: Integer;
  public
    procedure SaveContent( coMemento : TMementoMember );
    procedure RestoreContent( coMemento : TMementoMember );
end;

procedure TMember.SaveContent( coMemento : TMementoMember );
begin
  Zahl := FZahl;
end;

procedure TMember.RestoreContent( coMemento : TMementoMember );
begin
  FZahl := Zahl;
end;
und so sähe dann der aufruf aus:

Delphi-Quellcode:
 coMemento := TMementoMember.Create;
 s := tMember.Create;
 P := tMember.Create;
 ...
 //will aber hier.. ( ok dann mach hier :-) )
 s.SaveContent( coMemento );
 r.RestoreContent( coMemento );
 //durchführen, um die StringDaten von S an p zu übergeben und dann erst ändern
 ...
 s.zahl := 12;
 p.zahl := 12589;

 s.Free
 p.Free
 coMemento.Free;
Gruß
reli
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: TObject kopieren und zuweisen

  Alt 13. Jul 2006, 18:53
Zitat von Relicted:
jemand davon einen lösungsansatz?
Klar, dieses hier:

Delphi-Quellcode:
type
  TMember = class(TObject)
  private
    FZahl: Integer;
  public
    procedure Assign(AOriginal: TMember );
  end;

...

procedure TMember.Assign(AOriginal: TMember );
begin
  FZahl := AOriginal.FZahl;
end;
Und was war nun das Problem? Ist doch ganz einfach.

Hintergrund: Alle Klassen in einer Unit sind sich selber friend-Klassen und können daher auf deren (auch versteckten) Elemente und Methoden zurück greifen. Die Klasse TMember ist somit friend von sich selber und kann dies auch.

Sieht vllt. komisch aus, ist aber so. Probier es aus...
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: TObject kopieren und zuweisen

  Alt 13. Jul 2006, 23:26
jau hm stimmt friend klasse habsch ned bedacht...

die sache ist die: gibts evtl ne möglichkeit direkt eine kopie des speichers zu erstellen und an eine neue speicheradresse zu kopieren um dann den pointer des speicherorts an das neue objekt zu geben? ich bin halt eher auf der suche nach was verallgemeinenderen... dieses member variablen übergeben ist mir bissl zu aufwändig. soll auch eher eine frameworkklasse werden.
ich meine auch noch was im hinterkopf zu haben dass ein TObject sich in einen Stream schreiben kann und man den stream dann in ein anderes objekt übernehmen kann.. also nicht nur den zeiger sondern halt den inhalt über den stream verschieben kann.

gruß
reli
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 21:38 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