Постоянные объекты в 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 соединение потеряно или сервер не работает, приложение не работает.
Если сервер, на котором вы должны сохранять свои данные, не работает, лучшим способом обычно является сбой операции и возвращение ошибки. Таким образом, вам не нужно два отдельных набора кода сериализации, оба из которых необходимо синхронизировать друг с другом, и способ сбора локальных данных и их загрузки на сервер после их резервного копирования.
Кроме того, если ваше приложение зависит от удаленного сервера, вполне вероятно, что пользователь в любом случае не сможет многое сделать с ним в автономном режиме, так что это не такая уж плохая идея, как это может сначала прозвучать из пользовательского интерфейса. перспектива.