Thema: Delphi TStrings und Assign

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: TStrings und Assign

  Alt 17. Jun 2014, 20:09
TPersistent.Assign bzw. TPersistent.AssignTo machen nichts außer Fehlermeldungen anzuzeigen. Weshalb es diese Implentierung überhaupt gibt hab ich noch nie verstanden? TStrings.Assign ruft TPersistent.Assign auf wenn Source <> TStrings ist. TStrings hat kein AssignTo. Deine Klasse braucht deshalb ein eigenes AssignTo oder mit TStrings.Assign arbeiten (falls möglich)?
Das Delphi-Referenz durchsuchenTPersisten.Assign und Delphi-Referenz durchsuchenTPersistent.AssignTo ist ja nicht ausschließlich für Delphi-Referenz durchsuchenTStrings eingeführt worden, sondern auch um eigene Klassen zu implementieren.

Dann kommt zum besseren Verständnis hier mal eine Preisfrage:

Gegeben sind zwei Klassen in zwei getrennten Units:
Delphi-Quellcode:
unit Model_Person;

interface

uses
  Classes;

type
  TPerson = class( TPersistent )
  private
    FFirstname : string;
    FLastname : string;
    procedure AssignToPerson( Other : TPerson );
  protected
    procedure AssignTo( Dest : TPersistent ); override;
  public
    constructor Create( const Firstname, Lastname : string );
  published
    property Firstname : string read FFirstname;
    property Lastname : string read FLastname;
  end;

implementation

{ TPerson }

procedure TPerson.AssignTo( Dest : TPersistent );
begin
  if Dest is TPerson
  then
    AssignToPerson( Dest as TPerson )
  else
    inherited;
end;

procedure TPerson.AssignToPerson( Other : TPerson );
begin
  Other.FFirstname := Self.FFirstname;
  Other.FLastname := Self.FLastname;
end;

constructor TPerson.Create( const Firstname, Lastname : string );
begin
  inherited Create;
  FFirstname := Firstname;
  FLastname := Lastname;
end;

end.
und das entsprechende DatenTransferObjekt dazu
Delphi-Quellcode:
unit DTO_Person;

interface

uses
  Classes;

type
  TPerson_DTO = class( TPersistent )
  private
    FFirstname : string;
    FLastname : string;
    procedure AssignToPerson_DTO( Other : TPerson_DTO );
  protected
    procedure AssignTo( Dest : TPersistent ); override;
  published
    property Firstname : string read FFirstname write FFirstname;
    property Lastname : string read FLastname write FLastname;
  end;

implementation

{ TPerson_DTO }

procedure TPerson_DTO.AssignTo( Dest : TPersistent );
begin
  if Dest is TPerson_DTO
  then
    AssignToPerson_DTO( Dest as TPerson_DTO )
  else
    inherited;
end;

procedure TPerson_DTO.AssignToPerson_DTO( Other : TPerson_DTO );
begin
  Other.FFirstname := Self.FFirstname;
  Other.FLastname := Self.FLastname;
end;

end.
Nun wollen wir folgendes erreichen
Delphi-Quellcode:
program dp_180780;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  Model_Person in 'Model_Person.pas',
  DTO_Person in 'DTO_Person.pas';

procedure Main;
var
  LPerson_DTO : TPerson_DTO;
  LPerson : TPerson;
begin
  LPerson := TPerson.Create( 'Peter', 'Lustig' );
  try
    LPerson_DTO := TPerson_DTO.Create;
    try
      LPerson_DTO.Assign( LPerson );
      LPerson_DTO.Firstname := 'Erwin';
      LPerson.Assign( LPerson_DTO );
    finally
      LPerson_DTO.Free;
    end;
  finally
    LPerson.Free;
  end;
end;

begin
  try
    Main;
  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;

end.
Wie muss nun die Implementierung aussehen (ohne beide Klassen in eine Unit zu packen)?

Auflösung Model_Person.pas
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat