gpt4 book ai didi

delphi - Windows XP/Delphi 7 中的持久对象

转载 作者:行者123 更新时间:2023-12-03 15:30:03 27 4
gpt4 key购买 nike

我正在尝试在Delphi 7、Windows XP 中制作一个AlarmSystem。我必须在数据库(MS SQL Server 2000)中注册警报。但是如果服务器宕机了怎么办?好吧,我可以想象我必须保留 TAlarm 类型的对象。那么,我该怎么做呢?也许继承自TComponent???请问,我该怎么做??

非常感谢。

我对我的英语感到抱歉。

这里有更多信息...基本上,TAlarm 是一个从 TObject 派生的类。还有另外 10 个类源自 TAlarm(某些类型的警报)。 TAlarm 有一个名为 FParams : TParams 的字段,子类只有一个 Execute 方法。字段 FParams 可以是不同的类型:TAlarmX1_Params、TAlarmX2_Params 等等。

最佳答案

您可以继承 TPersistent,然后使用 TJvAppXMLFileStorage ( JVCL ) 组件来序列化 TAlarm 类。

保存对象

uses
JvAppXMLStorage;

Procedure SaveMyObject(MyAlarm : TAlarm)
var
MyStore: TJvAppXMLFileStorage;
begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.WritePersistent('', MyAlarm);
MyStore.Xml.SaveToFile('C:\MyAlarm.xml');
finally
MyStore.Free;
end;
end;

恢复对象

uses
JvAppXMLStorage;

Procedure LoadMyObject(MyAlarm : TAlarm)
var
MyStore: TJvAppXMLFileStorage;
begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.FileName:='C:\MyAlarm.xml';
MyStore.Xml.LoadFromFile('C:\MyAlarm.xml');
MyStore.ReadPersistent('', MyAlarm);
finally
MyStore.Free;
end;
end;

更新

如果您需要将多个对象持久保存到 XML 文件中,则必须为 WritePercient 和 ReadPercient 方法分配一个路径(唯一 ID)。

请参阅此示例,

多重持续

Procedure SaveMyObjects(MyObjects : Array of TComponent);
var
MyStore: TJvAppXMLFileStorage;
i : integer;
begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
for i := Low(MyObjects) to High(MyObjects) do
MyStore.WritePersistent(MyObjects[i].Name, MyObjects[i]); //In this case i use the name property of the component.
MyStore.Xml.SaveToFile('C:\Tools\MyAlarm.xml');
finally
MyStore.Free;
end;
end;

保存组件

SaveMyObjects([Button1,Button2,Edit1,Edit2]);

多次加载

Procedure LoadMyObjects(MyObjects:Array of TComponent);
var
MyStore : TJvAppXMLFileStorage;
i : integer;

begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.FileName:='C:\Tools\MyAlarm.xml';
MyStore.Xml.LoadFromFile('C:\Tools\MyAlarm.xml');
for i := Low(MyObjects) to High(MyObjects) do
MyStore.ReadPersistent(MyObjects[i].Name, MyObjects[i]);
finally
MyStore.Free;
end;
end;

恢复属性

LoadMyObjects([Button1,Button2,Edit1,Edit2]);

另一个加载选项

Procedure LoadMyObjectById(Id:String;MyObject:TComponent); //using the id of the object
var
MyStore : TJvAppXMLFileStorage;
i : integer;

begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.FileName:='C:\Tools\MyAlarm.xml';
MyStore.Xml.LoadFromFile('C:\Tools\MyAlarm.xml');
MyStore.ReadPersistent(id, MyObject);
finally
MyStore.Free;
end;
end;

你必须这样运行

LoadMyObjectById(Button1.Name,Button1); //Again using the Name property.

我希望这个例子有用;)

关于delphi - Windows XP/Delphi 7 中的持久对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com