2009-11-02 8 views
4

J'essaie de créer un AlarmSystem dans Delphi 7, Windows XP. Je dois enregistrer des alarmes dans une base de données (MS SQL Server 2000). Mais que faire si le serveur est en panne ??? Eh bien, je peux imaginer que je dois persister des objets de type TAlarm. Alors, comment puis-je faire cela? Peut-être hériter de TComponent ??? S'il vous plaît, comment puis-je faire cela ??Objets persistants sous Windows XP/Delphi 7

Merci beaucoup.

Je suis désolé pour mon anglais.

Ici vous avez plus d'informations ... TAlarm est une classe qui descend de TObject, fondamentalement. Il y a 10 classes de plus qui descendent de TAlarm (certains types d'alarmes). TAlarm a un champ nommé FParams: TParams, et les classes enfants ont seulement une méthode Execute. Le champ FParams peut être de différents types: TAlarmX1_Params, TAlarmX2_Params, etc., etc.

+0

Vous devez fournir plus d'informations. De quel type est basé TAlarm? Qu'est-ce que vous avez exactement besoin de stocker? –

+1

La raison de demander plus d'informations est que la façon dont vous devez persister dépend de ce que vous essayez d'économiser. Si, par exemple, tout ce que vous avez besoin de stocker est la date et l'heure d'une alarme et une description de l'objet de l'alarme, vous pouvez l'enregistrer dans un fichier INI sans stocker toutes les autres parties d'une classe. Cependant, si vos besoins sont plus complexes, il peut être préférable de stocker toute la classe. Sans en savoir plus, il est difficile de vous fournir une bonne réponse. –

+0

Désolé l'homme. Maintenant, tout ce que vous avez de nouvelles informations dans ma question. J'espère que ça aide. J'apprécie votre aide. – DelphiProgrammer

Répondre

0

Vous pouvez conserver les informations dans un fichier XML ou INI localement. Cela ne nécessite pas de changer de quoi TAlarm descend. Vous devrez cependant persister manuellement et restaurer toutes les propriétés que vous souhaitez conserver localement. Ça ne devrait pas être si compliqué.

+0

Je suis désolé mon ami, mais je n'ai jamais persisté des objets. S'il vous plaît, dites-moi où je peux trouver un tutoriel ou un manuel sur la persistance. Comment puis-je conserver l'information localement dans un fichier XML ou INI ?? Donnez un exemple s'il vous plait. Merci beaucoup. – DelphiProgrammer

4

Vous pouvez hériter de TPersistent, puis vous pouvez utiliser le composant TJvAppXMLFileStorage (JVCL) pour sérialiser la classe TAlarm.

Enregistrer un objet

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; 

Restaurer un objet

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; 

MISE À JOUR

Si vous devez persister plus d'un objet à l'X Fichier ML vous devez affecter un chemin (identifiant unique) aux méthodes WritePersistent et ReadPersistent.

Voir cet exemple,

multiples persist

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; 

pour enregistrer les composants

SaveMyObjects([Button1,Button2,Edit1,Edit2]); 

multiples CHARGE

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; 

Pour restaurer les propriétés

LoadMyObjects([Button1,Button2,Edit1,Edit2]); 

Une autre option pour charger

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; 

vous devez exécuter cette façon

LoadMyObjectById(Button1.Name,Button1); //Again using the Name property. 

J'espère que cet exemple sera utile;)

+0

Je ne vois pas de code qui assigne une nouvelle valeur aux arguments 'MyAlarm', alors pourquoi sont-ils passés par référence? –

+0

Rob vous avez raison, dans ce cas, il n'est pas nécessaire d'utiliser VAR. – RRUZ

+2

Ok, c'est vrai ... mais que faire si je dois persister plus d'un objet ?? Comment lire plus d'un objet du XML ??? – DelphiProgrammer

0

Si le serveur sur lequel vous êtes censé enregistrer vos données est hors service, le meilleur moyen consiste généralement à provoquer l'échec de l'opération et à renvoyer une erreur. De cette façon, vous n'avez pas besoin de deux ensembles distincts de codes de sérialisation, qui doivent tous deux être synchronisés entre eux, et d'un moyen de prendre vos données locales et de les télécharger sur le serveur une fois qu'il est sauvegardé. De plus, si votre application dépend d'un serveur distant, il est probable que l'utilisateur ne pourra pas en faire beaucoup avec le mode hors connexion, ce qui n'est pas une mauvaise idée une perspective d'interface utilisateur.

0

J'ai utilisé une base de données locale, un fichier Access mdb accessible via ADO, avec le même schéma que le serveur. Lorsque la connexion se rétablit, j'ai fait une synchronisation. Mais, de nos jours, j'ai abandonné cette technique; Lorsque la connexion est perdue ou que le serveur est arrêté, l'application échoue.