2009-03-30 30 views
10

Làm cách nào để lưu một đối tượng ở trạng thái hiện tại vào một tệp? Vì vậy, nó ngay lập tức có thể được đọc và phục hồi với tất cả các biến của nó.Lưu TObject vào một Tệp

+0

Wikipedia nói: "Tập hợp các giá trị của các thuộc tính của một đối tượng cụ thể được gọi là trạng thái của nó." Delphi thực sự không có cơ chế tích hợp để lưu trạng thái đối tượng đầy đủ bất kể khả năng hiển thị, chỉ các thuộc tính được xuất bản mới được hỗ trợ. RTTI nên được mở rộng để tùy chọn bao gồm tất cả các trường IMHO. – mjn

+0

Tình trạng này có được cập nhật không? – PSyLoCKe

Trả lời

4

Điều bạn đang tìm kiếm được gọi là kiên trì đối tượng. Điều này article có thể giúp đỡ, và có rất nhiều người khác nếu bạn google cho "delphi kiên trì đối tượng".

+1

Có lẽ người đàn ông đã sử dụng Google đã trỏ anh ta đến Stackoverflow. "Hỏi Google" không phải là câu trả lời thực sự. Thay vào đó, câu trả lời của Francois là câu trả lời REAL (và hữu ích). – Ampere

1

There is a good tutorial here. Hãy nhớ rằng bạn phải có RTTI (thông tin kiểu thời gian chạy) để lưu một đối tượng vào thời gian chạy bằng cách sử dụng phương pháp này, vì vậy nó sẽ chỉ chụp xuất bản thuộc tính của một lớp.

2

Ngoài ra còn có một cuộn riêng của bạn XML method tại đây trên S.O.

4

Nếu bạn hạ xuống đối tượng của mình từ TComponent, bạn có thể sử dụng một số chức năng tích hợp để truyền đối tượng vào một tệp. Tôi nghĩ rằng điều này chỉ hoạt động tốt cho các đối tượng đơn giản.

Một số mẫu mã để giúp bạn bắt đầu:

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

Như đã nêu, cách dễ nhất là sử dụng một Suối và nó WriteComponentReadComponent phương pháp.
Nhưng lưu ý rằng:
- nó hoạt động cho con cháu của TComponent, không thuần túy TObject;
- chỉ đối với các thuộc tính đã xuất bản (các thuộc tính được lưu trong dfm), không phải là các thuộc tính công cộng cũng không phải là (fortiori) các thuộc tính riêng tư;
- bạn phải đặc biệt chú ý đến thuộc tính Tên khi khôi phục thành phần.

Bạn có thể tìm thấy một số mã bạn có thể sử dụng trong các SO câu trả lời: Replace visual component at runtime in Delphi, Duplicating components at Run-Time

-1

Bạn đã nhận được một số câu trả lời tốt câu hỏi của bạn. Tùy thuộc vào những gì bạn đang thực sự làm, nó có thể là mong muốn sử dụng một thư viện được xây dựng trước hoặc thành phần để lưu các đối tượng. Đây là một bộ thư viện/thành phần không tốn kém và tiện lợi khiến cho việc lưu giữ và khôi phục các đối tượng trở nên tầm thường, và khá dễ dàng (ví dụ, với một chút mã) có thể lưu giữ ngay cả các thành viên chưa được xuất bản của một đối tượng: http://www.deepsoftware.ru/rsllib/index.html Không phải cái gì đó là khoa học tên lửa, nhưng nếu bạn đang làm rất nhiều thứ kiểu này thì thành phần này cung cấp một khung làm đẹp cho nó.

Developer Express cũng bao gồm một thành phần cxPropertiesStore mục đích chung như một phần của thư viện ExpressEditors đi kèm với một số thành phần của chúng.

1
  1. Rất đơn giản và giải pháp hiệu quả: DragonSoft's XML Class Serializer
  2. Ngoài ra bạn có thể sử dụng JVCL TJvAppXMLFileStorage:

    sử dụng 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; 
    
Các vấn đề liên quan