Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Klasse kopieren (https://www.delphipraxis.net/67557-klasse-kopieren.html)

Martin W 16. Apr 2006 17:40


Klasse kopieren
 
Hi;

Ich habe folgenden Code:

Delphi-Quellcode:
type TProfilDetails = class
  public
    Name: String;
  end;

type TProfil = class
  public
    File_version: integer;
    Profile: array of TProfilDetails;
  end;

// TCP Servereinstellungen
type TTcpServerPreferencesBindings = class
  public
    IP: String;
    Port: integer;
  end;

type TTcpServerPreferences = class
  public
    File_version: integer;
    Bindings: array of TTcpServerPreferencesBindings;
  end;

var
  Profil: TProfil;
  TcpServerPreferences: TTcpServerPreferences;
  Profil_bak: TProfil;
  TcpServerPreferences_bak: TTcpServerPreferences;
Mit der Klasse "Profil" und "TcpServerPreferences" arbeite ich ständig. Diese Daten verändern sich häufig in kurzen Zeitabständen. Wie kann ich die Werte von "Profil" nach "Profil_bak" am leichtesten kopieren?

Ich will nicht darauf verweisen, wie ich mit:

Delphi-Quellcode:
Profil_bak := Profil;
tun würde. Ich will in beiden Klassen unabhängig voneinander Werte ändern können. Nur muss die Klasse Anfangs erst alle Werte der anderen Klasse kopiert bekommen... wie geht das am leichtesten?

Gruß
Martin W. :-)

Elvis 16. Apr 2006 17:44

Re: Klasse kopieren
 
Jezt die große Frage bevor auch nur die kleinste Antwort sinnvoll wäre: Meinst du wirklich D.Net oder native Delphi?

Martin W 16. Apr 2006 17:46

Re: Klasse kopieren
 
Also die Anwendung ist eine VCL- Formularanwendung / Delphi für .net

... meinst du des`?

Elvis 16. Apr 2006 17:48

Re: Klasse kopieren
 
Zitat:

Zitat von Martin W
Also die Anwendung ist eine VCL- Formularanwendung / Delphi für .net
... meinst du des`?

Ja meinte ich. Ich hätte dir bei D32 oder bei reinem .Net helfen können. Bei VCL.Net steige ich hier lieber aus, bevor ich irgendwelchen BS verzapfe... ;)

Martin W 16. Apr 2006 17:50

Re: Klasse kopieren
 
Dann mach einfach mal nen Vorschlag trotzdem... nen Anhaltspunkt zum Nachschauen für mich...

Gruß

Elvis 16. Apr 2006 18:13

Re: Klasse kopieren
 
Um einen Clone anzufertigen würde ich den Standardweg gehen und IClonable implementieren:
Delphi-Quellcode:
type
   SomeClass = class(ICloneable)
   protected
      function UntypedClone : Object; implements ICloneable.Clone;
   public
      property SomeValue : String
         read fSomeValue write fSomeValue ;
      function Clone : SomeClass; virtual;
   private
      fSomeValue: String;
   end;

implementation

function SomeClass.UntypedClone : Object;
begin
   result := Clone();
end;

function SomeClass.Clone : SomeClass;
begin
   result := MemberwiseClone() as SomeClass;
end;
Ich verwende aber einen andere Pascal Dialekt für .Net, sollte aber ähnlich genug sein um das Prinzip zu erkennen.

Bei D.Net musst du allerdings noch schauen, wie da Delphi-Referenz durchsuchenInteface resolution clauses benutzt werden. Implements gibt es ja nicht mehr bzw. gab es in der Form auch nicht in Delphi32...

Wichtig ist definitv MSDN-Library durchsuchenMemberwiseClone, egal ob du nun das Interface imlementierst oder nicht.

Hier noch ein Test:
Delphi-Quellcode:
var instance1 := new SomeClass(SomeValue := 'Hallo');
var instance2 := instance1.Clone();

instance1.SomeValue := 'Abc';

Console.WriteLine(instance1.SomeValue);
Console.WriteLine(instance2.SomeValue);
Output
Abc
Hallo

Martin W 17. Apr 2006 08:48

Re: Klasse kopieren
 
Jetzt hab ich schon länger rumprobiert, auch mit Assign... aber es will nicht klappen. :( Warum klappt z.B. dieser Code nicht:

Delphi-Quellcode:
// Profile
type TProfilDetails = class
  public
    Name: String;
  end;

type TProfil = class (TPersistent)
  public
    File_version: integer;
    Profile: array of TProfilDetails;
  end;

// TCP Servereinstellungen
type TTcpServerPreferencesBindings = class
  public
    IP: String;
    Port: integer;
  end;

type TTcpServerPreferences = class (TPersistent)
  public
    File_version: integer;
    Bindings: array of TTcpServerPreferencesBindings;
  end;

var
  server_mainform_form: Tserver_mainform_form;
  Profil: TProfil;
  TcpServerPreferences: TTcpServerPreferences;
  Profil_bak: TProfil;
  TcpServerPreferences_bak: TTcpServerPreferences;


function xxx: boolean,
begin
  TcpServerPreferences_bak.Assign(TcpServerPreferences);
end;
Gruß
Martin W.

Khabarakh 17. Apr 2006 09:03

Re: Klasse kopieren
 
Du darfst Elvis ruhig glauben, ICloneable is the way to go.
Wenn du schon unter .Net programmierst, würde ich das ganze VCL/RTL-Zeug schnell vergessen und zusammen mit dem T-Präfix und globalen Variablen wegsperren.
Ich glaube zwar nicht, dass du mir ein einziges Argument für TPersistent unter .Net liefern kannst, aber: Du solltest Assign(To) auch überschreiben.

Elvis 17. Apr 2006 09:11

Re: Klasse kopieren
 
Zitat:

Zitat von Martin W
Warum klappt z.B. dieser Code nicht

Du hast da soviele globale Funktionen, Variablen, initialization und Konsorten drin, dass der Code mit keiner "richtigen" .Net-Sprache kompilierbar wäre.
Bist du dir gaaanz sicher, dass du nicht lieber in der Win32-Welt bleiben willst?

Da du anscheinend deine "Klassen" sogar wie Records benutzt muss ich mich doch fragen wie "länger rumprobiert" aussah.
Schaue mal auf Luckies Homepage, da findest du ein kleines Tutorial zu objektorientierter Programmierung.
Bis dahin sehe ich eigentlich keinen Sinn hier zu antworten...

letzter Tip: Assign muss überschreiben werden, da TPersistent keine Ahnung von deinen Feldern hat...

Adios :hi:

Martin W 17. Apr 2006 09:46

Re: Klasse kopieren
 
Da wir ja jetzt ehr darüber reden ob ich dies oder jenes kann, und es nicht mehr nur um mein "Problem" geht habe ich zu dem ganzen mal ein neuen Thread aufgemacht... bitte gebt mir nen bissel konstuktive Kritik und Hilfe.. denn ohne wird man nicht besser !!!

Link zum anderen Posting

Danke;

gruß
Martin W.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 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