Windows XP / Delphi 7中的持久对象

时间:2009-11-02 19:25:59

标签: delphi persistence delphi-7

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

非常感谢。

对不起我的英语。

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

4 个答案:

答案 0 :(得分:4)

您可以继承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文件,则必须为WritePersistent和ReadPersistent方法分配路径(唯一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.

我希望这个例子有用;)

答案 1 :(得分:0)

您可以在本地将信息保存在XML或INI文件中。这不需要改变TAlarm的下降。您需要手动保留并恢复您希望在本地保留的所有属性。不应该那么复杂。

答案 2 :(得分:0)

如果您应该将保存数据的服务器关闭,则最佳操作方法通常是导致操作失败并返回错误。这样,您就不需要两组独立的序列化代码,两者都必须保持彼此同步,以及一种在本地数据备份后将其上传到服务器的方法。

另外,如果您的应用程序依赖于远程服务器,那么用户可能无法在离线状态下对其进行太多操作,因此这不是一个想法,因为它可能首先从用户界面视角。

答案 3 :(得分:0)

我使用了一个本地数据库,一个通过ADO访问的Access mdb文件,其架构与服务器相同。当连接恢复时,我进行了同步。但是,如今,我放弃了这种技术;如果连接丢失或服务器关闭,应用程序将失败。