Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#2

Re: XML Serialisierer für beliebige DelphiObjecte auf RTTI B

  Alt 25. Feb 2009, 17:50
die Begeisterung hält sich ja erstaunlicherweise in Grenzen.
Na das werde ich mal versuchen mit einer neuen Version zu ändern

Man kann nette Dinge mit der RTTI anstellen.
Zum Beispiel alle published Properties einfach von einem Object ins andere kopieren.
(man beachte, dass kein assign notwendig ist)
P.S. es gibt eine neue Version vom Original, die modifzierte befindet sich wieder im Anhang

folgendene Definition....

type



Delphi-Quellcode:
TMyEnum = (meNotset, meEnum1, meEnum2);


TInClass = class(TPersistent)
                              
private
    FString : string;
published
  property StringValue : String read FString write FString;
end;


//==============================================================================

TMyClass = class(TPersistent)
                               
private
    FInObj : TInClass;
    FString : string;
    FNewDouble: Double;
    FEnum: TMyEnum;
    FTop: Integer;
published
  constructor create;
  destructor destroy; override;
  function Show : string;

  property EnumValue : TMyEnum read FEnum write FEnum;
  property DoubleValue : Double read FNewDouble write FNEwDouble;
  property StringValue : String read FString write FString;
  property InObject : TInClass read FInObj write FInObj;
  property Top : Integer read FTop write FTop;

end;


implementation

//==============================================================================
{ TMyClass }
//==============================================================================
constructor TMyClass.create;
begin
  inherited create;
// FInObj := TInClass.Create(self);
// FInObj.SetSubComponent(true);
  FInObj := TInClass.Create;
end;
//==============================================================================
destructor TMyClass.destroy;
begin

  FInObj.Free;
  inherited;
end;
//==============================================================================

function TMyClass.Show: string;
begin
      ShowMessage(
          'EnumValue: '       + GetEnumName(TypeInfo(TMyEnum ) , integer(Self.FEnum)) + #13#10 +
          'StringValue: '     + self.StringValue + #13#10 +
          'DoubleValue: '     + FloatToStr(self.DoubleValue) + #13#10 +
          'TopValue: '        + IntToStr(self.Top) + #13#10 +
          'InnerClass Value: '+ self.InObject.StringValue);
end;

das ist der Test ...



Delphi-Quellcode:
procedure TfrmXMLSerialisierer.btnCopyPuPropClick(Sender: TObject);
var
  myObject : TMyClass;
  myCopy : TMyClass;

begin


    MyObject := TMyClass.Create;
    myObject.Top := 10;
    myObject.Show;

    // "Top" Property von Form kopieren (ist die einzigste gemeinsame Property"
    // man beachte, es gibt nirgendwo eine Assign Procedure

    myObject.CopyPupProperiesFrom(self);

    MyObject.StringValue := DateTimeToStr(Now);
    MyObject.EnumValue := meEnum1;
    MyObject.DoubleValue := 12345.67;
    MyObject.InObject.StringValue := 'Inner Class';

    myObject.Show;

     // neues Object (Kopie)
     myCopy := TMyClass.create;
     myObject.CopyPupProperiesTo(myCopy);
     myCopy.Show;


    // speichern //
    MyObject.SaveToXML('MyClass.xml');
    MyObject.Free;

    // Laden
    MyObject := TMyClass.Create;
    MyObject.LoadFromXML('MyClass.xml');
    myObject.Show;
    MyObject.Free;
end;
Angehängte Dateien
Dateityp: pas xmlserializer_169.pas (52,6 KB, 27x aufgerufen)
Dateityp: pas ubase_xmlserializer_101.pas (19,4 KB, 27x aufgerufen)
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat