簡體   English   中英

Windows XP / Delphi 7中的持久對象

[英]Persistent Objects in Windows XP/Delphi 7

我試圖在Windows XP的Delphi 7中制作一個AlarmSystem。 我必須在數據庫(MS SQL Server 2000)中注冊警報。 但是,如果服務器已關閉怎么辦? 好吧,我可以想象我必須保留TAlarm類型的對象。 那么,我該怎么做呢? 也許繼承自TComponent ??? 拜托,我該怎么做?

非常感謝。

我對我的英語感到抱歉。

在這里,您可以獲得更多信息... TAlarm基本上是一個從TObject派生的類。 TAlarm(某些類型的警報)還提供10個以上的類。 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文件,則必須為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.

我希望這個例子會有用;)

您可以將信息持久保存在本地的XML或INI文件中。 不需要更改TAlarm的來源。 但是,您將需要手動保留並恢復希望保留在本地的所有屬性。 不應該那么復雜。

如果應該將數據保存到的服務器已關閉,則最佳的做法通常是使操作失敗並返回錯誤。 這樣,您就不需要兩組單獨的序列化代碼,而這兩組代碼必須彼此保持同步,並且不需要一種獲取本地數據並在備份后將其上傳到服務器的方法。

另外,如果您的應用程序依賴於遠程服務器,則用戶無論如何都可能無法離線處理該應用程序,因此這並不像它最初在用戶界面上造成的麻煩透視。

我使用了本地數據庫,即通過ADO訪問的Access mdb文件,其架構與服務器相同。 連接恢復后,我進行了同步。 但是,如今,我放棄了這種技術。 wnen連接丟失或服務器已關閉,應用程序失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM