4

Delphi 7、Windows XP で AlarmSystem を作成しようとしています。データベース (MS SQL Server 2000) にアラームを登録する必要があります。しかし、サーバーがダウンした場合はどうなりますか?そうですね、TAarm タイプのオブジェクトを永続化する必要があることは想像できます。それで、どうすればこれを行うことができますか?多分TComponentから継承しますか??? どうすればこれを行うことができますか??

どうもありがとう。

私の英語で申し訳ありません。

ここに詳細があります... TAlarm は、基本的に TObject から派生したクラスです。TAlarm から派生するクラスがさらに 10 あります (いくつかの種類のアラーム)。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

XML または INI ファイルの情報をローカルに永続化できます。TAlarm の派生元を変更する必要はありません。ただし、ローカルで永続化したいすべてのプロパティを手動で永続化および復元する必要があります。それほど複雑ではないはずです。

于 2009-11-02T19:54:51.423 に答える
0

サーバーと同じスキーマで、ADO を介してアクセスされる Access mdb ファイルであるローカル データベースを使用しました。接続が回復したら、同期を行いました。しかし、今日、私はこのテクニックをやめました。接続が失われたり、サーバーがダウンしている場合、アプリケーションは失敗します。

于 2009-11-02T23:30:09.730 に答える
0

データの保存先となるサーバーがダウンしている場合、通常、最善のアクションは操作を失敗させてエラーを返すことです。この方法では、シリアル化コードの 2 つの別個のセットを必要とせず、両方を相互に同期させる必要がなく、ローカル データを取得してバックアップ後にサーバーにアップロードする方法も必要ありません。

さらに、アプリがリモート サーバーに依存している場合、ユーザーはいずれにせよオフラインで多くのことを実行できない可能性が高いため、これは最初はユーザー インターフェースで失敗する可能性があるため、それほど悪い考えではありません。視点。

于 2009-11-02T20:18:42.530 に答える