Ich habe gerade das Gefühl ein Brett vor dem Kopf zu haben.
Beim Refactoring einer vorhandenen Software baue ich gerade etwas zu einem Interface um. Vorher war das ein einfacher Record und eine
Unit mit ein paar Prozeduren und Funktionen.
Ich brauche jetzt eine Methode, um die Inhalte einer Instanz auf eine andere zu kopieren. Mein Problem dabei ist, dass ich mich irgendwie im Kreis drehe. Die Instanzen werden auf Basis des Interfaces erzeugt. Die Inhalte sind aber zum Teil erst im InterfacedObject enthalten, bzw. über Properties erreichbar, deren Setter aber dazu führt, dass interne Changed-Kennzeichen gesetzt werden, was ich aber beim Kopieren nicht haben will.
Die Sourcen in abgespeckter Version:
Das Interface:
Delphi-Quellcode:
IMyInt = interface
// Setter
procedure SetA(AValue: Boolean);
// Getter
function GetA: Boolean;
function GetB: String;
function Clone: IMyInt;
function Save: Boolean;
// Properties
property A: Boolean read GetA write SetA;
property B: String read GetB;
end;
Die Klasse:
Delphi-Quellcode:
TMyClass =
class(TInterfacedObject, IMyInt)
strict private
fA: Boolean;
fB:
String;
fChanged: Boolean;
private
procedure SetA(AValue: Boolean);
function GetA: Boolean;
function GetB:
String;
public
constructor Create;
destructor Destroy();
override;
function Clone: IMyInt;
function Save: Boolean;
property A: Boolean
read GetA
write SetA;
property B:
String read GetB;
end;
....
procedure TMyClass.SetA(AValue: Boolean);
begin
if fA <> AValue
then begin
fChanged := True;
fA := AValue;
end;
end;
In der Anwendung selbst, gibt es bereits zwei Instanzen. Es geht also nur darum, die Inhalte von einer Instanz in die Andere zu kopieren, ohne automatische fChanged zu setzen und dabei auch alles zu kopieren. Für Property B gibt es zum Beispiel keinen Setter. Das ganze würde ich gerne über eine Methode innerhalb der Klasse lösen. Da die Instanzen vom Typ IMyInt sind, kann ich nicht auf die Member-Variablen zugreifen. Ich habe gestern noch einiges probiert, hatte aber irgendwann das Gefühl mich im Kreis zu drehen und mir selbst den Blick für die Lösung zu verstellen.
Kann ich jemand mal in die richtige Richtung schubsen?