AGB  ·  Datenschutz  ·  Impressum  







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

Klasse komplett dublizieren

Ein Thema von Alexander Roth · begonnen am 10. Okt 2006 · letzter Beitrag vom 10. Okt 2006
Antwort Antwort
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#1

Klasse komplett dublizieren

  Alt 10. Okt 2006, 14:42
Hallo,

ich weis, ich weis. Das Thema hatten wir schon sehr oft. Ich habe allerdings keine Lösung gefunden die ganz allgemein und für jede Klasse gilt.

Es habe nämlich folgendes Problem: In meinem Programm SolariXX benutze ich die "RiverSoftAVG Charting Component Suite". Wenn ich z.B. nun hineinzoome ist es äußerst schwierig wieder den vorherigen Zustand wiederherzustellen.

Deshalb wäre eine imho elegante Lösung die Klasse temporär zu kopieren und im gegebenen Fall einfach zurück zu kopieren. Doch leider funktioniert Assign nicht und MrSpock's Ansatz (hier) funktioniert irgendwie bei mir auch nicht. Ich glaube jedoch dieser Ansatz ist der erfolgversprechenste.

Deshalb habe ich mir mal ein TestProjekt schnell mal angelegt und irgendwie passiert gar nix.
Also Eine Form mit einem Edit was Temporär kopiert und wiederhergestellt werden soll.
Delphi-Quellcode:
var
  Form1: TForm1;

  ed:Tedit;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  Move(Pointer(self.Edit1)^, Pointer(ed)^, sizeof(self.Edit1));
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  Move(Pointer(ed)^, Pointer(self.Edit1)^, sizeof(ed));
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  ed:=Tedit.Create(self);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ed.Free;
end;
Was mache ich falsch?
Wieso muss man eigentlich das so schriben: Pointer(ed)^
Was bewirkt das?

Gibt es vielleicht einen einacheren Weg?

Kann man vielleicht die Felder und Propertys einer Klasse ganz allgemein durchlaufen?
Also so was für Felder anstadt Objekten:
Delphi-Quellcode:
    for i:=0 to form1.ComponentCount -1 do
      begin
      if form1.Components[i] is TEdit then
        // do something
      end;
Danke im Voraus

Gruß Alexander
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Klasse komplett dublizieren

  Alt 10. Okt 2006, 15:05
1.) wenn du versuchst, ein Objekt mit Move() zu kopieren, wirst du in der Hölle braten, denn das geht garantiert schief! Objekte werden mehrfach freigeben und es hagelt AVs.
2.) wenn du den Sourcode hast, dann solltest du die Assign-Methode verbessern
3.) wenn du keinen Sourcecode hast, dann schreibst du dir eine Kopierfunktion:
Delphi-Quellcode:
procedure CopyChart(source, dest : TChart);
begin
   // fiktives Beispiel
   dest.zoomfactor := source.zoomfactor;
   dest.height : source.height;
   dest.Font.Assign(source.Font); // so wird ein enthaltenes Objekt kopiert
   ....
   // es ist mühsam jedes Property runterzuschreiben, aber auf jeden Fall sicher

   // du willst vielleicht nicht alle properties kopieren,
   // deshalb würde ein automatisches Kopieren alle Props nicht sinnvoll sein
end
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Klasse komplett dublizieren

  Alt 10. Okt 2006, 15:21
Zitat von shmia:
1.) wenn du versuchst, ein Objekt mit Move() zu kopieren, wirst du in der Hölle braten, denn das geht garantiert schief! Objekte werden mehrfach freigeben und es hagelt AVs.
Kapiert.

Ich komme dann wohl nicht um die Kopierfunktion herum. Das ist zwar alles andere als:
Zitat von Alexander Roth:
die ganz allgemein und für jede Klasse gilt.
Aber na ja.


Wieso hat Borland denn eigentlich so eine wichtige Sache nicht eingebaut? Wieso geht das nicht?!
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Klasse komplett dublizieren

  Alt 10. Okt 2006, 15:52
Nenn mir mal eine Sprache, in der du jede beliebige Klasse kopieren kannst.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Klasse komplett dublizieren

  Alt 10. Okt 2006, 16:29
imho alle .net sprachen
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Klasse komplett dublizieren

  Alt 10. Okt 2006, 16:33
Du kannst ein Objekt in .net auch nur dann clonen, wenn es IClonable implementiert oder serialisierbar ([Serializable]) ist. Das is auch nicht überall...
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#7

Re: Klasse komplett dublizieren

  Alt 10. Okt 2006, 16:40
Der Fehler liegt IMHO hier:
Zitat von Alexander Roth:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Move(Pointer(self.Edit1)^, Pointer(ed)^, sizeof(self.Edit1));
end;
sizeof(Edit1) gibt immer 4 aus. Warum? Weil n TEdit nur n Pointer is... ggf. könnte es funktionieren, wenn du noch n Pointer()^ mit einbaust. Trotzdem: Wie unser Spitzohriger Mod schon gesagt hat: Mehr als unschön...

Zitat:
Wieso muss man eigentlich das so schriben: Pointer(ed)^
Was bewirkt das?
Das ich Trock 18. So bekommst du ein dereferenziertes Objekt, was eigentlich aus gutem Grund gar nicht geht...

Zitat:
Gibt es vielleicht einen einacheren Weg?

Kann man vielleicht die Felder und Propertys einer Klasse ganz allgemein durchlaufen?
Also so was für Felder anstadt Objekten:
Delphi-Quellcode:
    for i:=0 to form1.ComponentCount -1 do
      begin
      if form1.Components[i] is TEdit then
        // do something
      end;
Guck dir mal RTTI an. Damit könnte das gehen, was du willst...

Zitat von 3_of_8:
Nenn mir mal eine Sprache, in der du jede beliebige Klasse kopieren kannst.
u.a. .NET-Sprachen und C++. IMHO. .NET hat MemberwiseClone(damit gehts per Trick 19) und ICloneable(sowas wie Assign bei Delphi) C++ kennt sowas wie Kopierkonstruktoren(und so kranke Konstrukte, wie lokale statische Objekte aufm Stack )...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Klasse komplett dublizieren

  Alt 10. Okt 2006, 16:41
Hi,
Sprachen die Reflections unterstützen machen es einem zumindest um einiges leichter. An sich kann man hier natürlich irgendeine Sprache wählen, die man gerade selbst entwickelt, die das kann oder halt etwas wie C (zeig mir das C-Objekt, dass sich nicht clonen lässt). Ob man Klassen clonen kann oder nicht wäre jetzt wohl Ansichtssache, bei den Objekten geht es auf jeden Fall in den weitverbreiteten Sprachen nicht. Dürfte aber schon daran liegen, dass sonst die Schutzklassen sinnlos wären...

Gruß Der Unwissende
  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 00:16 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