Thema: Delphi XML aktualisieren

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: XML aktualisieren

  Alt 28. Nov 2009, 12:07
Zitat von wbdelpprax:
ist nicht gerade sehr hilfreich, denn wenn ich es probiert habe und es nicht geklappt hat - was sollte mir das dann Deiner Meinung bringen?
nja, war mehr soeine Antwort ala "eigentlich sollte ein komplettes Neuladen doch funktionieren ... wie versuchst du es denn derzet?"

Wenn man jetzt nur Folgendes macht,
Delphi-Quellcode:
xml.active := false;
xml.active := true;
dann wird der Parser nur neu gestartet, aber da MSXML-DOM die Datei beim LoadFromFile in internen einen Puffer läd und dann hierbei praktisch immer nur diesen Puffer neu parst, können natürlich Änderungen an der eigentlichen Datei nicht im Ergebnis einfließen werden.

Zitat von wbdelpprax:
Zwar konnte ich mit dem Fileage nichts anfangen, denn gegen welches Datum sollte ich denn eine potentielle Änderung prüfen?
Du speicherst dir einfach beim Laden über irgendeine Funktion (z.B. Delphi-Referenz durchsuchenFileAge) das letzte Änderungsdatum und vergleichst es dann jedes mal mit dem gespeichertem Wert.
Somitt könnte man z.B. alle ein paar Sekunden das Datum prüfen, aber mußte nicht ständig die Datei neu einlesen, welches ja aufwändiger wäre (von der CPU- und Datenträgerbelastung).

LoadFromFile sollte nach dem erfolgreichen Einlesen immer datmod.DataModule1.xmldocument1.Active auf True setzen, wenn nicht, dann ist irgendwas schiefgelaufen und es würde eigentlich eine Exception ausgelöst.
Delphi-Quellcode:
type
  TFSlideShow = Class...
  private
    OldFileAge: TDateTime;
  end;

function TFSlideShow.open_xml(OpenAlways: Boolean = false): Boolean;
var A: TDateTime;
begin
   //if XML exist take over all the values for the pic
   if fileexists(g_xmlpath) then
   begin
     if OpenAlways or not FileAge(xmlpath, A) or (A < OldFileAge) then
     begin
       OldFileAge := A;
       //activate the xml file for the unit
       datmod.DataModule1.XMLDocument1.LoadFromFile(g_xmlpath);
       datmod.wbpickeys := Getwbpickeys(datmod.DataModule1.XMLDocument1);
     end;
     // datmod.wbpickeys := Getwbpickeys(datmod.DataModule1.XMLDocument1);
     result:= true;
   end
   else
     result:= false;
end;
ich weiß jetzt nicht, was Getwbpickeys macht, also gönnte es sein, daß man dieses eventuell etwas verschieben müßte.

OpenAlways auf True setzen, wenn wirklich (neu) geladen werden soll, also z.B. beim ersten Mal nach Programmstart.
Ansonsten wird die Datei nur noch bei Veränderungen (des Datums der letzen Änderung) geladen.
$2B or not $2B
  Mit Zitat antworten Zitat