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
Trả lời
Đ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".
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
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.
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.
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.
Như đã nêu, cách dễ nhất là sử dụng một Suối và nó WriteComponent và ReadComponent 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
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.
- Rất đơn giản và giải pháp hiệu quả: DragonSoft's XML Class Serializer
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;
- 1. lưu tin nhắn pylint vào một tệp
- 2. Java: Lưu StreamResult vào một tệp
- 3. Dữ liệu nào chứa TObject?
- 4. Cách lưu một đối tượng vào một tệp trong Delphi
- 5. cast TObject sử dụng ClassType của mình?
- 6. Cách lưu tệp vào iPhone?
- 7. HTML5 lưu canvas vào tệp
- 8. Lưu CGImageRef vào tệp png?
- 9. TProc <TObject> để TNotifyEvent
- 10. lưu Btrees vào một tệp đĩa và đọc nó
- 11. Lưu canvas HTML 5 vào một tệp trong Chrome?
- 12. Lưu cấu trúc C với chuỗi char * vào một tệp
- 13. Lưu số dấu phẩy động vào một tệp
- 14. Lưu khóa RSA vào một tệp, sử dụng pycrypto
- 15. Lưu mẫu jsRender vào một tệp js riêng biệt
- 16. Cách lưu hình ảnh WPF vào một tệp
- 17. Không thể lưu đầu ra của minicom vào một tệp
- 18. lưu tệp văn bản vào một biến trong bash
- 19. Lưu băm MD5 của một tệp văn bản vào cùng một tệp văn bản?
- 20. R - lưu nhiều nhân tố vào tệp
- 21. Lưu trữ vào tệp bằng JavaScript/GreaseMonkey
- 22. Sự cố khi lưu ảnh vào tệp
- 23. Làm cách nào để nén nhiều tệp vào một tệp lưu trữ duy nhất với Delphi
- 24. Chỉ đẩy một tệp vào GitHub từ một kho lưu trữ cục bộ
- 25. Có thể hiển thị một WebImage mà không lưu nó vào một tệp trước không?
- 26. Làm cách nào để lưu trữ một dấu thời gian time_t vào một tệp bằng C?
- 27. Sử dụng kế thừa trong hàm tạo "Tạo" của một TObject
- 28. Có nên lưu trữ nhiều văn bản được lưu trữ định kỳ vào bộ đệm trước khi lưu vào một tệp không?
- 29. Cách tạo bytecode và lưu vào tệp .class?
- 30. Đệ quy thêm tệp vào kho lưu trữ Subversion
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
Tình trạng này có được cập nhật không? – PSyLoCKe