Постоянные объекты в Windows XP / Delphi 7 - PullRequest
4 голосов
/ 02 ноября 2009

Я пытаюсь сделать 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 ]

4 голосов
/ 02 ноября 2009

Вы можете наследовать от 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

Если вам необходимо сохранить более одного объекта в файле 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.

Надеюсь, этот пример будет полезен;)

0 голосов
/ 03 ноября 2009

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

0 голосов
/ 02 ноября 2009

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

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

0 голосов
/ 02 ноября 2009

Вы можете сохранить информацию в файле XML или INI локально. Это не требует изменения того, откуда происходит TAlarm. Вам нужно будет вручную сохранить и восстановить все свойства, которые вы хотите сохранить локально, хотя. Не должно быть так сложно.

...