2009-11-02 257 views
4

我想在Delphi 7,Windows XP中創建一個AlarmSystem。我必須在數據庫中註冊警報(MS SQL Server 2000)。但是,如果服務器壞了呢?那麼,我可以想象,我必須堅持TAlarm類型的對象。那麼,我該怎麼做?也許從TComponent繼承?請,我該怎麼做?Windows XP/Delphi 7中的持久對象

非常感謝。

對於我的英語很抱歉。

這裏有更多信息... TAlarm基本上是一個從TObject下來的類。還有10個從TAlarm下來的類(某些類型的警報)。 TAlarm有一個名爲FParams:TParams的字段,子類只有一個Execute方法。字段FParams可以是不同的類型:TAlarmX1_Params,TAlarmX2_Params等等,等等。

+0

您需要提供更多信息。 TAlarm基於什麼類型?你需要存儲什麼? – 2009-11-02 19:32:17

+1

詢問更多信息的原因是,你應該如何堅持事情取決於你想要保存的是什麼。例如,如果您需要存儲的只是報警的日期和時間以及報警內容的描述,則可以將其保存在INI文件中,而不必存儲班級的所有其他部分。但是,如果您的需求比這更復雜,那麼以某種方式存儲整個班級可能會更好。不知道更多,很難爲你提供一個很好的答案。 – 2009-11-02 19:42:22

+0

對不起。現在,您在我的問題中有了新的信息。我希望有所幫助。我喜歡你的幫助。 – DelphiProgrammer 2009-11-03 13:36:05

回答

0

您可以將信息保存在本地的XML或INI文件中。這並不需要改變TAlarm的下降。您需要手動持久化並恢復您希望本地保留的所有屬性。不應該那麼複雜。

+0

對不起,我的朋友,但我從來沒有堅持的對象。請告訴我在哪裏可以找到關於持久性的任何教程或手冊。我如何在XML或INI文件中本地保存信息?請舉個例子。非常感謝。 – DelphiProgrammer 2009-11-03 13:53:03

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; 

UPDATE

如果你需要保留多個對象的X ML文件,您必須爲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. 

我希望這個例子將是有益的; )

+0

我看不到爲MyAlarm參數指定新值的代碼,爲什麼它們通過引用傳遞? – 2009-11-02 20:32:14

+0

Rob你說得對,在這種情況下沒有必要使用VAR。 – RRUZ 2009-11-02 20:51:52

+2

好吧,沒錯......但如果我必須堅持多個對象呢?如何從XML中讀取多個對象? – DelphiProgrammer 2009-11-03 13:22:56

0

如果您應該將數據保存到的服務器已關閉,則最佳操作過程通常是導致操作失敗並返回錯誤。這樣您就不需要兩套獨立的序列化代碼,這兩套代碼必須保持彼此同步,並且一旦獲得本地數據並在備份後將其上載到服務器,就是一種方法。

另外,如果你的應用程序依賴於遠程服務器,那麼很可能用戶無法在離線狀態下做很多事情,所以這並不像一開始可能會有所改變那樣糟糕。一個用戶界面的角度。

0

我使用了一個本地數據庫,一個通過ADO訪問的Access mdb文件,它的架構與服務器相同。當連接恢復時,我做了同步。但是,現在,我放棄了這種技術;當連接丟失或服務器關閉時,應用程序將失敗。