AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wieso kann man Listenelemente nicht kopieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Wieso kann man Listenelemente nicht kopieren?

Offene Frage von "wonnebeekiwi"
Ein Thema von wonnebeekiwi · begonnen am 29. Mär 2009 · letzter Beitrag vom 29. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
wonnebeekiwi

Registriert seit: 23. Mär 2009
16 Beiträge
 
#1

Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 15:44
Wieso kann man Listenelemente nicht kopieren?
Ich versuche ein Element aus einer Liste zu kopieren. Wenn ich die kopie veränder, ändert sich das orginal selbst.
Hier mal im extrem Fall:
Delphi-Quellcode:
procedure TElement.xy;
var Kopie: TElement;
begin
  Kopie := Self;
  Kopie.Free;
end;
Das Element ist gelöscht!!!
Das stellt mich echt vor Probleme. Kann mir jemand schlaueres eine Anregung geben, wie ich mit dem Problem fertig werde?
Grüße
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 15:46
Du kopierst nur den Zeiger auf das Element und greifst damit immer auf das gleiche Element zu. Also nix mit kopiert (vom Zeiger abgesehen).

ganz allgemein:
Delphi-Quellcode:
Kopie.Create
Kopie.Assign(self)
Wobei darin enthaltene Objekte durch den Destruktor wohl auch freigegeben werden. Kommt jetzt darauf an, was TElement genau für eine Klasse ist.
  Mit Zitat antworten Zitat
wonnebeekiwi

Registriert seit: 23. Mär 2009
16 Beiträge
 
#3

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 15:57
Danke erstmal ;).
Ich kann die Assign Methode nicht nutzen. Delphi zeigt den Fehler: Unbekannterbezeichner an.
TElement ist von der Klasse TObject (TElement = class(TObject)).
Das mit dem Zeiger hört sich sehr sinnvoll an. Die Delphi Hilfe sagt,ich könne die Assign Methode nur für TCollection nutzen. Wie soll ich das machen?
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 15:59
Zitat von wonnebeekiwi:
Danke erstmal .
Ich kann die Assign Methode nicht nutzen. Delphi zeigt den Fehler: Unbekannterbezeichner an.
TElement ist von der Klasse TObject (TElement = class(TObject)).
Das mit dem Zeiger hört sich sehr sinnvoll an. Die Delphi Hilfe sagt,ich könne die Assign Methode nur für TCollection nutzen. Wie soll ich das machen?
Leite TElement von TPersistent ab.
  Mit Zitat antworten Zitat
wonnebeekiwi

Registriert seit: 23. Mär 2009
16 Beiträge
 
#5

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 16:09
Muss ich die Klasse umdefinieren?
...Das habe ich gerade probiert: TElement=class(TPersistent).
Der Rechner kennt aber kein TPersistent.
Habe ich was falsch verstanden?
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 16:15
uses classes eingetragen?

die OH sollte TPersistent aber finden und dort steht (zumindest bei D5) auch die evtl. zu verwendende Unit
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 16:19
Delphi-Referenz durchsuchenTPersistent liegt (wenn ich mich richtig erinnere) in der Unit "Classes". Das heißt du musst diese Unit einbinden.

Und als zweites musst du die Methode "Assign" bzw "AssignTo" überschreiben, damit Delphi auch weiß, was den für Daten übernommen werden müssen. Mal ein kleines Beispiel:
Delphi-Quellcode:
type
  TAssignBeispiel = class(TPersistent)
  private
    FEineZahl : Integer;

    procedure AssignTo(Dest: TPersistent);
  public
    property EineZahl : Integer read FEineZahl write FEineZahl;

    procedure Assign(Source: TPersistent); override;
  end;

[...]

procedure TAssignBeispiel.AssignTo(Dest: TPersistent);
begin
  if Dest is TAssignBeispiel then
    TAssignBeispiel(Dest).FEineZahl := Self.FEineZahl
  else
    inherited;
end;

procedure TAssignBeispiel.Assign(Source: TPersistent);
begin
  if Source is TAssignBeispiel then
    Self.FEineZahl := TAssignBeispiel(Source).FEineZahl
  else
    inherited;
end;
MfG
xZise

PS: Mist da war jemand schneller...

[edit]AssignTo + else-Zweig(e)[/edit]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 16:20
Zitat von Andreas L.:
Leite TElement von TPersistent ab.
Das reicht nicht. Er muss auch noch die Assign-Methode für TElement umschreiben, denn sonst kommt nur "TElement kann nicht zu TElement zugewiesen werden".
  Mit Zitat antworten Zitat
wonnebeekiwi

Registriert seit: 23. Mär 2009
16 Beiträge
 
#9

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 16:27
Ich Idiot habe natürlich die uses deklaration vergessen.:wall:
Zeigt keine Fehler mehr an.... muss das Programm aber nochmal überarbeiten weil ich jetzt Errors habe.
Da kommt tatsächlich: "TElement kann nicht zu TElement zugewiesen werden".
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Wieso kann man Listenelemente nicht kopieren?

  Alt 29. Mär 2009, 16:31
Naja wie gesagt Assign überschreiben (AssignTo ist imho nur optional)
Zitat von xZise:
[...]Und als zweites musst du die Methode "Assign" bzw "AssignTo" überschreiben, damit Delphi auch weiß, was den für Daten übernommen werden müssen. Mal ein kleines Beispiel:
Delphi-Quellcode:
type
  TAssignBeispiel = class(TPersistent)
  private
    FEineZahl : Integer;

    procedure AssignTo(Dest: TPersistent);
  public
    property EineZahl : Integer read FEineZahl write FEineZahl;

    procedure Assign(Source: TPersistent); override;
  end;

[...]

procedure TAssignBeispiel.AssignTo(Dest: TPersistent);
begin
  if Dest is TAssignBeispiel then
    TAssignBeispiel(Dest).FEineZahl := Self.FEineZahl
  else
    inherited;
end;

procedure TAssignBeispiel.Assign(Source: TPersistent);
begin
  if Source is TAssignBeispiel then
    Self.FEineZahl := TAssignBeispiel(Source).FEineZahl
  else
    inherited;
end;
[...]
Wenn Source oder Dest nicht ein Objekt die von TAssignBeispiel oder dessen Nachfahren abgeleitet ist, wird die standardmethode (die von Persistent) aufgerufen die einen Fehler verursachen wird. Somit bist du eigentlich immer auf der sicheren Seite

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:53 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