![]() |
XML aktualisieren
Hallo Leute,
ich habe heute mal folgendes Problem: Ich habe ein Bildbetrachtungsprogramm geschrieben. Man kann u. a. diverse Information zu den jpg's in einer XML-Datei ablegen (Pfad, Keywords, Favorit-Kennung, etc.). Wenn nun aber die XML-Datei von außerhalb des Programms geändert wird (z.B. ein Bild-Satz gelöscht wird), dann bekommt das Programm dies nicht mit und findet - z. B. beim suchen per Keyword - dieses Bild immer noch in der XML. Ich habe schon versucht, die XML-Datei vor jeder Aktion damit vorher auf "active = false" und dann wieder auf "active:= true" zu setzen oder sogar die Datei vorher auf "nil" zu setzen und dann komplett wieder einzulesen. Aber das hat alles nichts gebracht. Es scheint sich immer noch um die alte XML zu handeln. Erst wenn die Anwendung geschlossen wird, dann wird das Bild beim nächsten Start der Anwendung und der Suche nach dem Bild nicht mehr in der XML gefunden. Wie kann ich es erreichen, dass die Änderungen in der XML-Datei bei laufendem Programm erkannt werden? Ich denke da an so was wie einen Refresh oder so. Die XML liegt übrigens in einem Datenmodul - aber das kann ja wohl nicht das Problem sein. Bis denn Andreas |
Re: XML aktualisieren
[dp]Verzeichnis überwachen[/dp]
False > True kann nix bringen, da hier ja der Inhalt im RAM nur neu aktiviert wird. Zitat:
z.B. mit ![]() |
Re: XML aktualisieren
Hi himitsu,
konnte leider erst jetzt antworten, da ich 2 Tage kein Internet hatte. Vielen Dank für Deine Antwort: - das mit 'true > false' ist natürlich klar - war dumm von mir, das zu probieren - Dein Hinweis Zitat:
- Aber dies hier: Zitat:
Aber das mit dem Einlesen hat sich als hilfreich erwiesen. Ich habe jetzt folgendes gemacht und das hat wunderbar geholfen:
Delphi-Quellcode:
Also vielen Dank nochmals und vielleicht hat das ja auch dem einen oder anderem geholfen.
function TFSlideShow.open_xml:Boolean;
begin //if XML exist take over all the values for the pic if fileexists(g_xmlpath) then begin //activate the xml file for the unit datmod.DataModule1.XMLDocument1.LoadFromFile(g_xmlpath); <<==hier einfach immer neu einlesen, dann komen alle Änderungen aktuell mit datmod.DataModule1.XMLDocument1.FileName:= g_xmlpath; datmod.wbpickeys := Getwbpickeys(datmod.DataModule1.XMLDocument1); if datmod.DataModule1.xmldocument1.Active= false then datmod.DataModule1.xmldocument1.Active:= true; result:= true; end else result:= false; end; Gruss Andreas 8-) ! PS.: Das mit dem Kommentar im Delphicode hatte in der Vorschau sehr gut ausgesehen - aber hier im Forum gibt es leider hässliche Zeilenumbrüche. Ich hoffe, dass kann man dennoch lesen! |
Re: XML aktualisieren
Zitat:
Wenn man jetzt nur Folgendes macht,
Delphi-Quellcode:
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.
xml.active := false;
xml.active := true; Zitat:
![]() 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:
ich weiß jetzt nicht, was Getwbpickeys macht, also gönnte es sein, daß man dieses eventuell etwas verschieben müßte.
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; 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. |
Re: XML aktualisieren
Hi himitsu,
vielen Dank für Deinen Aufwand - wirklich toll! Aber ich hatte Dir ja schon geschrieben, dass es jetzt klappt :wink: Mit dem Einlesen der XML-Datei in das XMLDocument1 jedes mal vor einer erneuten XML-Aktion ist alles ok:
Delphi-Quellcode:
g_xmlpath ist übrigens eine globale Variable, die den Pfad inklusive dem Namen der XML-Datei enthält. Die Angaben darüber werden vom Anwender in eine ini-Datei geschrieben. So kann er - wenn denn gewollt - die XML-Datei in jedes beliebige Verzeichnis legen und das Programm weiß dann immer, wo es nach der XML zu suchen hat.
//activate the xml file for the unit
datmod.DataModule1.XMLDocument1.LoadFromFile(g_xmlpath); <<==hier einfach immer neu einlesen, dann komen alle Änderungen aktuell mit Gruß Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz