4

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

非常感谢。

我对我的英语感到抱歉。

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

4

4 回答 4

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.

我希望这个例子会有用;)

于 2009-11-02T19:57:29.313 回答
0

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

另外,如果您的应用程序依赖于远程服务器,那么用户可能无论如何都无法离线使用它,所以这并不像一开始从用户界面做的那样糟糕看法。

于 2009-11-02T20:18:42.530 回答
0

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

于 2009-11-02T23:30:09.730 回答
0

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

于 2009-11-02T19:54:51.423 回答