Постоянные объекты в Windows XP/Delphi 7

Я пытаюсь сделать AlarmSystem в Delphi 7, Windows XP. Я должен зарегистрировать тревоги в базе данных (MS SQL Server 2000). Но что, если сервер не работает??? Ну, я могу представить, что мне нужно сохранять объекты типа TAlarm. Итак, как я могу это сделать? Может наследовать от TComponent??? Пожалуйста, как я могу это сделать?

Большое спасибо.

Я сожалею о своем английском.

Здесь у вас есть больше информации... TAlarm - это класс, который происходит от TObject. Есть еще 10 классов, которые происходят от TAlarm (некоторые типы сигналов тревоги). TAlarm имеет поле с именем FParams: TParams, а дочерние классы имеют только метод Execute. Поле FParams может быть разных типов: TAlarmX1_Params, TAlarmX2_Params и т. Д. И т. Д. И т. Д.

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.

Смотрите этот пример,

Многократный персист

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. Вам нужно будет вручную сохранить и восстановить все свойства, которые вы хотите сохранить локально, хотя. Не должно быть так сложно.

Я использовал локальную базу данных, файл Access mdb, доступ к которому осуществляется через ADO, с той же схемой, что и на сервере. Когда соединение восстанавливается, я сделал синхронизацию. Но в настоящее время я отбросил эту технику; wnen соединение потеряно или сервер не работает, приложение не работает.

Если сервер, на котором вы должны сохранять свои данные, не работает, лучшим способом обычно является сбой операции и возвращение ошибки. Таким образом, вам не нужно два отдельных набора кода сериализации, оба из которых необходимо синхронизировать друг с другом, и способ сбора локальных данных и их загрузки на сервер после их резервного копирования.

Кроме того, если ваше приложение зависит от удаленного сервера, вполне вероятно, что пользователь в любом случае не сможет многое сделать с ним в автономном режиме, так что это не такая уж плохая идея, как это может сначала прозвучать из пользовательского интерфейса. перспектива.

Другие вопросы по тегам