TStringList可以把字符串加进去,然后saveAsFile, 用的时候,可以loadFromFile()来从文件中还原对象,我想知道,有没有哪个类可以把对象加进去,然后可以saveAsFile,然后
用的时候,可以类似loadFromFile来还原的? 本来TStringList来addObject方法,但是我发现addObject()加对象进去后,再saveAsFile,文件内容是不包括对象的字节码的。请问有人遇到过这个问题吗?或者怎样解决这个问题。希望回答具体点,谢谢了。
用的时候,可以类似loadFromFile来还原的? 本来TStringList来addObject方法,但是我发现addObject()加对象进去后,再saveAsFile,文件内容是不包括对象的字节码的。请问有人遇到过这个问题吗?或者怎样解决这个问题。希望回答具体点,谢谢了。
解决方案 »
- 我想不用DLL,做一个局部钩子,就是钩当前程序的回车键,下面代码就是不行,帮助我看看。
- 不同类型数据库之间导数据,类型转换怎么处理?
- 请教:我调试好的数据库程序,换了一台电脑,就说找不到数据库文件的问题,谢谢!
- 关于登录窗口设计
- Drate(小虫)请来接1000分__6) 原贴:http://expert.csdn.net/Expert/topic/2227/2227167.xml?temp=.3559534
- 请教文件的复制、删除
- Frame与Form的区别?
- 不要不理我。API高手请看:GetCaretPos和WindowFromPoint我想用这两个函数
- 如何制作插件?
- 本人要做一个项目,是物料管理系统,請大家給點提示?答者有分
- 关于DELPHI的控件问题
- 局域网计算机如何访问主机的ACCESS数据库?
JAVA相对简单,它没有指针,它的类是静态的(如C的静态类),所以它的内容是可直接取到的
TMemoryStream.WriteComponent
TMemoryStream.SaveToFile
可以把一TComponent存成二进制文件,用readComponent读取
TGraphicItem = class
private
FKey: String;
FGraphic: TGraphic;
public
property Key: String read FKey write FKey;
property Graphic: TGraphic read FGraphic write FGraphic;
procedure ReadFromStream(AStream: TStream);
procedure WriteToStream(AStream: TStream);
end; TGraphicList = class(TObjectList)
public
property Items[Index: Integer]: TGraphicItem read GetItem write SetItem; default;
procedure LoadFromStream(AStream: TStream);
procedure SaveToStream(AStream: TStream);
procedure LoadFromFile(const AFileName: String);
procedure SaveToFile(const AFileName: String);
end;// LoadFromFile 实现如下所示
// 注意, 此处使用的是TFileStream, 不要使用TMemoryStream, 因为使用TMemoryStream
// 会浪费更多的内存空间
procedure TGraphicList.LoadFromFile(const AFileName: String);
var
tmpStream: TFileStream;
begin
tmpStream := TFileStream.Create(AFileName, fmOpenRead);
try
LoadFromStream(tmpStream);
finally
tmpStream.Free;
end;
end;// SaveToFile 的实现方法如下
procedure TGraphicList.SaveToFile(const AFileName: String);
var
tmpStream: TFileStream;
begin
tmpStream := TFileStream.Create(AFileName, fmCreate);
try
SaveToStream(tmpStream);
finally
tmpStream.Free;
end;
end;// SaveToStream 实现如下
procedure TGraphicList.SaveToStream(AStream: TStream);
var
i: Integer;
tmpCount: Integer;
begin
tmpCount := Count;
AStream.WriteBuffer(tmpCount, sizeof(tmpCount));
for i := 0 to tmpCount - 1 do
Items[i].WriteToStream(AStream);
end;// LoadFromStream 实现如下
procedure TGraphicList.LoadFromStream(AStream: TStream);
var
tmpCount: Integer;
i: Integer;
tmpItem: TGraphicItem;
begin
Clear; // 注意此处如果OwnsObjects属性为True时, 其自动释放了列表中的所有对象
// 如果OwnsObjects为False时, 则需要则需要在此句之前增加释放列表中的所有对象的代码
AStream.ReadBuffer(tmpCount, sizeof(tmpCount));
for i := tmpCount - 1 downto 0 do
begin
tmpItem := TGraphicItem.Create;
try
tmpItem.ReadFromStream(AStream);
Add(tmpItem);
except
tmpItem.Free;
raise;
end;
end;
end;先写到这儿, 下面继续
对于图像的保存, 可以保存图象的二进制数据, 因为这样其数据量较小
对于TGraphicItem, 必须保存Key, 二进制数据, 图像类型的标识(此处, 我使用类名)
对于字符串的保存, 先保存长度, 再保存内容
对于二进制数据的保存, 也先保存其长度, 再保存内容字符串的写入和读取函数如下
procedure WriteStringToStream(AStream: TStream; const AValue: String);
var
iLen: Integer;
begin
iLen := length(AValue);
AStream.WriteBuffer(iLen, sizeof(iLen));
if iLen > 0 then
AStream.WriteBuffer(AValue[1], iLen);
end;function ReadStringFromStream(AStream: TStream): String;
var
iLen: Integer;
begin
AStream.ReadBuffer(iLen, sizeof(iLen));
SetLength(Result, iLen);
if iLen > 0 then
AStream.ReadBuffer(Result[1], iLen);
end;二进制数据的写入的读取函数如下
procedure WriteStreamToStream(AStream: TStream; sub: TMemoryStream);
var
iLen: Integer;
begin
iLen := sub.Size;
AStream.WriteBuffer(iLen, sizeof(iLen));
if iLen > 0 then
AStream.WriteBuffer(sub.Memory^, iLen);
end;procedure ReadStreamFromStream(AStream: TStream; sub: TMemoryStream);
var
iLen: Integer;
begin
AStream.ReadBuffer(iLen, sizeof(iLen));
sub.SetSize(iLen);
if iLen > 0 then
AStream.ReadBuffer(sub.Memory^, iLen);
end;对于各项的读取和写入, 实现如下
procedure TGraphicItem.WriteToStream(AStream: TStream);
var
sub: TMemoryStream;
begin
WriteStringToStream(AStream, FKey);
WriteStringToStream(AStream, FGraphic.ClassName);
sub := TMemoryStream.Create;
try
FGraphic.SaveToStream(sub);
WriteStreamToStream(AStream, sub);
finally
sub.free;
end;
end;procedure TGraphicItem.WriteToStream(AStream: TStream);
var
sub: TMemoryStream;
tmpClassName: String;
tmpClass: TGraphicClass;
begin
FKey := ReadStringFromStream(AStream);
tmpClassName := ReadStringFromStream(AStream);
tmpClass := TGraphicClass(GetClass(tmpClassName));
if tmpClass = nil then
raise Exception.Create('graphic type not support'); // 此处最好用你自己声明的异常 if Assigned(FGraphic) then
FreeAndNil(FGraphic); FGraphic := tmpClass.Create;
sub := TMemoryStream.Create;
try
ReadStreamFromStream(AStream, sub);
sub.Position := 0;
FGraphic.LoadFromStream(sub);
finally
sub.Free;
end;
end;至此OK, 你所需要的关键部分都已经给出来了
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.com