Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows XP/Delphi 7中的持久对象_Delphi_Persistence_Delphi 7 - Fatal编程技术网

Windows XP/Delphi 7中的持久对象

Windows XP/Delphi 7中的持久对象,delphi,persistence,delphi-7,Delphi,Persistence,Delphi 7,我正在尝试用Delphi7和WindowsXP制作一个报警系统。我必须在数据库(MS SQL Server 2000)中注册报警。但是如果服务器关闭了呢???我可以想象,我必须持久化TAlarm类型的对象。那么,我该怎么做呢?可能是从TComponent继承的???拜托,我该怎么做 非常感谢 我对我的英语感到抱歉 这里你有更多的信息。。。 TAlarm基本上是从TObject派生的类。TAlarm(某些类型的报警)还有10个类。TAlarm有一个名为FParams:TParams的字段,子类只有

我正在尝试用Delphi7和WindowsXP制作一个报警系统。我必须在数据库(MS SQL Server 2000)中注册报警。但是如果服务器关闭了呢???我可以想象,我必须持久化TAlarm类型的对象。那么,我该怎么做呢?可能是从TComponent继承的???拜托,我该怎么做

非常感谢

我对我的英语感到抱歉

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

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

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

保存对象

还原对象

更新 如果需要将多个对象持久化到XML文件,则必须为WritePersistent和ReadPersistent方法分配路径(唯一id)

看这个例子

多个持久化

保存组件的步骤

SaveMyObjects([Button1,Button2,Edit1,Edit2]);
多重负载

恢复属性

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.

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

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


另外,如果你的应用程序依赖于远程服务器,那么用户很可能无法离线使用它,因此这并不像一开始从用户界面的角度来看那样糟糕。

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

您需要提供更多信息。TAlarm基于什么类型?你到底需要存储什么?询问更多信息的原因是,你应该如何保存东西取决于你到底要保存什么。例如,如果只需要存储报警的日期和时间以及报警的用途说明,则可以将其保存在INI文件中,而无需存储类的所有其他部分。但是,如果您的需求比这更复杂,那么最好以某种方式存储整个类。如果不知道更多,很难为你提供一个好的答案。对不起,伙计。现在你们在我的问题上有了新的信息。我希望这有帮助。感谢您的帮助。请查看关于存储多个对象的后续问题:@MLB,查看用于持久化多个对象的新示例。我没有看到为
MyAlarm
参数指定新值的代码,因此它们为什么通过引用传递?好的,没错。。。但是如果我必须保存多个对象呢??如何从XML中读取多个对象???您可以使用tObjectList保存多个对象,并在列表中进行迭代以进行写入。Skamradt,tObjectList不是从TPersistent派生的,因此不能在给定函数中使用。此外,Yulien似乎尝试使用Rruz的函数保存多个对象,但每个对象都会覆盖上一个对象。请参阅后续问题:对不起,我的朋友,但我从未保存对象。请告诉我在哪里可以找到关于持久性的教程或手册。如何在XML或INI文件中本地保存信息??请举个例子。非常感谢。
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.