[英]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.