2009-03-30 10 views
10

¿Cómo se puede guardar un Objeto, en su estado actual, en un archivo? Para que pueda leerse y restaurarse inmediatamente con todas sus variables.Guardar un TObject en un archivo

+0

Wikipedia dice: "El conjunto de valores de los atributos de un objeto en particular se llama su estado." Delphi en realidad no tiene un mecanismo incorporado para guardar el estado completo del objeto, independientemente de la visibilidad, solo se admiten las propiedades publicadas. RTTI debe ampliarse para incluir opcionalmente todos los campos en mi humilde opinión. – mjn

+0

¿Se ha actualizado esta situación? – PSyLoCKe

Respuesta

4

Lo que está buscando se llama persistencia del objeto. Este article podría ayudar, y hay muchos otros si busca en google "objetos persistentes delphi".

+1

Probablemente el hombre usó Google que lo apuntó a Stackoverflow. "Preguntar a Google" no es una respuesta real. La respuesta de Francois en su lugar es una respuesta REAL (y útil). – Ampere

1

There is a good tutorial here. Tenga en cuenta que debe tener RTTI (información de tipo de tiempo de ejecución) para guardar un objeto en tiempo de ejecución utilizando este enfoque, por lo que solo capturará propiedades publicadas de una clase.

4

Si desciende su objeto desde TComponent, puede usar algunas funciones incorporadas para transmitir el objeto a un archivo. Creo que esto solo funciona bien para objetos simples.

un código de ejemplo para ayudarle a empezar:

unit Unit1; 

interface 

uses 
    Classes; 

type 
    TMyClass = class(TComponent) 
    private 
    FMyInteger: integer; 
    FMyBool: boolean; 
    FMyString: string; 
    public 
    procedure ToFile(AFileName: string); 
    published 
    property MyInteger: integer read FMyInteger write FMyInteger; 
    property MyString: string read FMyString write FMyString; 
    property MyBool: boolean read FMyBool write FMyBool; 
    end; 

implementation 

{ TMyClass } 

procedure TMyClass.ToFile(AFileName: string); 
var 
    MyStream: TFileStream; 
begin 
    MyStream := TFileStream.Create(AFileName); 
    try 
    Mystream.WriteComponent(Self); 
    finally 
    MyStream.Free; 
    end; 
end; 

end. 
4

Como ya se ha dicho, la manera más fácil es usar un corriente y su WriteComponent y ReadComponent métodos.
Pero ser conscientes de que:
- funciona para los descendientes de TComponent, TObject no llanura;
- solo para las propiedades publicadas (las guardadas en dfm), no las públicas ni (a fortiori) las privilegiadas;
- tiene que preste especial atención a la propiedad Nombre al restaurar el componente.

Usted puede encontrar algo de código se puede utilizar en estas respuestas SO: Replace visual component at runtime in Delphi, Duplicating components at Run-Time

-1

si ya recibió algunas buenas respuestas a su pregunta. Dependiendo de lo que realmente esté haciendo, podría ser conveniente usar una biblioteca o componente preconstruido para guardar objetos. Este es un conjunto de biblioteca/componentes económico e ingenioso que hace que resulte trivial conservar y restaurar objetos, y con bastante facilidad (es decir, con un poco de código) acomoda miembros persistentes e inéditos de un objeto: http://www.deepsoftware.ru/rsllib/index.html No es algo que sea una ciencia revolucionaria. pero si estás haciendo mucho de este tipo de cosas, este componente proporciona un buen marco para ello.

Developer Express también incluye un componente de propósito general cxPropertiesStore como parte de la biblioteca de ExpressEditors que viene con algunos de sus componentes.

1
  1. muy simple y eficiente solución: DragonSoft's XML Class Serializer
  2. También puede utilizar JVCL TJvAppXMLFileStorage:

    utiliza JvAppXMLStorage;

    var 
        Storage: TJvAppXMLFileStorage; 
    begin 
        Storage := TJvAppXMLFileStorage.Create(nil); 
        try 
        Storage.WritePersistent('', MyObject); 
        Storage.Xml.SaveToFile('S:\TestFiles\Test.xml'); 
        Storage.Xml.LoadFromFile('S:\TestFiles\Test.xml'); 
        Storage.ReadPersistent('', MyObject); 
        finally 
        Storage.Free; 
        end; 
    end; 
    
Cuestiones relacionadas