Autor Beitrag
Nano-Ware
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Do 12.04.12 10:41 
Hey,

ja blöder Titel, aber mir fiel nichts besseres ein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TMyClass = class
    public
      Hey : String;
  end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  a,b : TMyClass;
begin

  a := TMyClass.Create;
  b := TMyClass.Create;
  a.Hey := 'Hey';
  b := a;
  ShowMessage(b.Hey); //Ausgabe "Hey" wie es sein soll
  a.Hey := 'Hallo';
  ShowMessage(b.Hey); //Ausgabe "Hallo" 

end;


So. Mit b:=a wird b nur eine Referenz auf a hinzugefügt. Nur wie mache ich das, dass b ein eigenständiges, von a unabhängiges Objekt wird? In Java schreib ich immer eine "CopyFrom"-Methode, die dann alle Werte einzeln überträgt, aber das kann auf Dauer zu viel Arbeit werden. Deshalb frage ich mich, ob Delphi einem da nicht Arbeit abnimmt.

Danke
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 12.04.12 10:45 
vor der Zuweisung war doch alles richtig, wenn Du Clonen willst mußt Du es selbst implementieren oder von TComponent ableiten
groups.google.com/gr...4e856cb3717642?pli=1

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Do 12.04.12 10:47 
Hab ich ja auch immer so gemacht. Durch eine CopyTo/CopyFrom Methode. Das wird allerdings happig, wenn man aufeinmal mehrere Klassen in einer anderen hat.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Do 12.04.12 11:05 
Du kannst von TPersistent ableiten und die Assign-Methode überschreiben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  TMyClass = class(TPersistent)
  private
    FHey: String;
  public
    procedure Assign(Source: TPersistent); override;
  published
    property Hey: String read FHey write FHey;
  end;

...

procedure TMyClass.Assign(Source: TPersistent);
begin
  if Source is TMyClass then
    FHey := TMyClass(Source).FHey
  else
    inherited Assign(Source);
end;
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 12.04.12 11:10 
Wenn Du mit TComponent leben kannst
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

 TInnerClass=Class(TComponent)
  private
    Fwert: Double;
  published
   Property Wert:Double read Fwert Write Fwert;
 End;

 TOuterClass=Class(TComponent)
  private
    Fwert: Double;
    FInnerClass: TInnerClass;
  public
  Constructor Create(Aowner:TComponent);override;
  Destructor Destroy;override;
  Function Clone:TOuterClass;
  published
   Property Wert:Double read Fwert Write Fwert;
   Property Innerclass:TInnerClass read FInnerClass;
 End;

  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TOuterClass }

function TOuterClass.Clone: TOuterClass;
var
 ms:TMemoryStream;
 i:Integer;
begin
   ms:=TMemoryStream.Create;
   ms.WriteComponent(self);
   ms.Position := 0;
   Result := TOuterClass.Create(nil);
   ms.ReadComponent(Result);
   for I := 0 to ComponentCount - 1 do
      begin
        ms.Clear;
        ms.WriteComponent(Components[i]);
        ms.Position := 0;
        ms.ReadComponent(Result.Components[i]);
      end;
end;

constructor TOuterClass.Create(Aowner:TComponent);
begin
  inherited;
  FinnerClass := TInnerClass.Create(self);
end;

destructor TOuterClass.Destroy;
begin

  inherited;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
 a,b:TOuterClass;
begin
  a := TouterClass.Create(nil);
  a.Innerclass.Wert := 1234;
  a.Wert := 7777;
  b := a.Clone;
  Showmessage(FloatToStr(b.Innerclass.Wert) + ' - ' + FloatToStr(b.Wert));
  a.Free;
  b.Free;
end;

end.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS