AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML aktualisieren

Ein Thema von wbdelpprax · begonnen am 25. Nov 2009 · letzter Beitrag vom 29. Nov 2009
Antwort Antwort
Benutzerbild von wbdelpprax
wbdelpprax

Registriert seit: 11. Mär 2008
36 Beiträge
 
#1

XML aktualisieren

  Alt 25. Nov 2009, 06:14
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: XML aktualisieren

  Alt 25. Nov 2009, 08:14
Hier im Forum suchenVerzeichnis überwachen

False > True kann nix bringen, da hier ja der Inhalt im RAM nur neu aktiviert wird.

Zitat:
und dann komplett wieder einzulesen.
das sollte aber gehn.

z.B. mit Delphi-Referenz durchsuchenFileAge prüfen ob Datei verändert und wenn, dann mit LoadFromFile neu laden
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von wbdelpprax
wbdelpprax

Registriert seit: 11. Mär 2008
36 Beiträge
 
#3

Re: XML aktualisieren

  Alt 28. Nov 2009, 08:20
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:
Zitat:
und dann komplett wieder einzulesen.

das sollte aber gehn.
ist nicht gerade sehr hilfreich, denn wenn ich es probiert habe und es nicht geklappt hat - was sollte mir das dann Deiner Meinung bringen?

- Aber dies hier:
Zitat:
z.B. mit Delphi-ReferenzFileAge prüfen ob Datei verändert und wenn, dann mit LoadFromFile neu laden
war schon viel hilfreicher. Zwar konnte ich mit dem Fileage nichts anfangen, denn gegen welches Datum sollte ich denn eine potentielle Änderung prüfen?

Aber das mit dem Einlesen hat sich als hilfreich erwiesen. Ich habe jetzt folgendes gemacht und das hat wunderbar geholfen:

Delphi-Quellcode:
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;
Also vielen Dank nochmals und vielleicht hat das ja auch dem einen oder anderem geholfen.
Gruss
Andreas !
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!
  Mit Zitat antworten Zitat
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
Benutzerbild von wbdelpprax
wbdelpprax

Registriert seit: 11. Mär 2008
36 Beiträge
 
#5

Re: XML aktualisieren

  Alt 29. Nov 2009, 02:37
Hi himitsu,
vielen Dank für Deinen Aufwand - wirklich toll!
Aber ich hatte Dir ja schon geschrieben, dass es jetzt klappt
Mit dem Einlesen der XML-Datei in das XMLDocument1 jedes mal vor einer erneuten XML-Aktion ist alles ok:
Delphi-Quellcode:
//activate the xml file for the unit
     datmod.DataModule1.XMLDocument1.LoadFromFile(g_xmlpath); <<==hier einfach immer neu
                                                                  einlesen, dann komen alle
                                                                  Änderungen aktuell mit
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.

Gruß
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz