AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi ListView laden/speichern mit XML
Thema durchsuchen
Ansicht
Themen-Optionen

ListView laden/speichern mit XML

Ein Thema von Helmi · begonnen am 30. Sep 2005 · letzter Beitrag vom 1. Okt 2005
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

ListView laden/speichern mit XML

  Alt 30. Sep 2005, 19:08
Hallo,

ich hab mal zwei prodeduren programmiert, mit denen man eine ListView in eine XML-Datei speichern bzw. aus einer XML-Datei laden kann.

Hier mal die Codes:
Delphi-Quellcode:
procedure ListView_speichern(AListView: TListView; Section: String; DateiName: TFileName);
var
  Anzahl_Zeilen : Integer;
  Anzahl_SubItems : Integer;
  Index_Image : Integer;
  i : Integer;
  j : Integer;
  Bool_Check : Boolean;
  Caption_Text : String;
  SubItem_Text : String;
  S : String;
  XML_Node : IXMLNode;
  FXMLDoc : TXMLDocument;

begin
  with AListView do
    begin
      FXMLDoc := TXMLDocument.Create(Application);

      with FXMLDoc do
        begin
          If FileExists(DateiName) then
            LoadFromFile(DateiName)
          else
            AddChild(Section);

          Options := [doNodeAutoIndent];
          Active := True;

          DocumentElement.ChildNodes.Clear;

          //Anzahl der Zeilen auslesen
          Anzahl_Zeilen := Items.Count;

          If not Assigned(XML_Node) then
            XML_Node := DocumentElement.AddChild('Items');

          //Anzahl der Zeilen in die Datei schreiben
          XML_Node.Attributes['Count'] := IntToStr(Anzahl_Zeilen);

          //Anzahl der Zahlen größer 0?
          If Anzahl_Zeilen > 0 then
            for i := 1 to Anzahl_Zeilen do
              with Items[i - 1] do
                begin
                  S := 'SubItems' + IntToStr(i);
                  XML_Node := DocumentElement.AddChild(S);

                  //Anzahl der SubItems auslesen
                  Anzahl_SubItems := SubItems.Count;

                  //Anzahl der SubItems in die Datei schreiben
                  XML_Node.Attributes['Count'] := IntToStr(Anzahl_SubItems);

                  //Index des Images auslesen
                  Index_Image := ImageIndex;

                  //Index des Images in die Datei schreiben
                  XML_Node.Attributes['Index'] := IntToStr(Index_Image);

                  //Caption auslesen
                  Caption_Text := Caption;

                  //Captions in die Datei schreiben
                  XML_Node.Attributes['Caption'] := Caption_Text;

                  If Anzahl_SubItems > 0 then
                    for j := 0 to Pred(Anzahl_SubItems) do
                      begin
                        //SubItem auslesen
                        SubItem_Text := SubItems[j];

                        //SubItem in die Datei schreiben
                        XML_Node.Attributes['SubItem' + IntToStr(j)] := SubItem_Text;
                      end;

                  //
                  Bool_Check := Items.Item[i - 1].Checked;

                  //
                  XML_Node.Attributes['CheckBox'] := BoolToStr(Bool_Check, true);
                end;
          SaveToFile(DateiName);
        end;
    end;
end;
Delphi-Quellcode:
procedure ListView_laden(AListView: TListView; Section: String; DateiName: TFileName);
var
  Anzahl_Zeilen : Integer;
  Anzahl_SubItems : Integer;
  Index_Image : Integer;
  i : Integer;
  j : Integer;
  Bool_Check : Boolean;
  Caption_Text : String;
  SubItem_Text : String;
  S : String;
  XML_Node : IXMLNode;
  FXMLDoc : TXMLDocument;

begin
  with AListView do
    begin
      Items.Clear;

      If not FileExists(DateiName) then
        exit;

      FXMLDoc := TXMLDocument.Create(Application);

      with FXMLDoc do
        begin
          LoadFromFile(DateiName);

          Options := [doNodeAutoIndent];
          Active := True;

          XML_Node := DocumentElement.ChildNodes.FindNode('Items');

          S := 'Count';
          If Assigned(XML_Node) and XML_Node.HasAttribute(S) then
            Anzahl_Zeilen := XML_Node.Attributes[S];

          for i := 1 to Anzahl_Zeilen do
            with Items.Add do
              begin
                //Image-Index aus der Datei lesen
                S := 'Index';
                If Assigned(XML_Node) and XML_Node.HasAttribute(S) then
                  Index_Image := XML_Node.Attributes[S];

                //Image-Index in die ListView schreiben
                ImageIndex := Index_Image;

                S := 'SubItems' + IntToStr(i);
                XML_Node := FXMLDoc.DocumentElement.ChildNodes.FindNode(S);

                //Caption aus der Datei lesen
                S := 'Caption';
                If Assigned(XML_Node) and XML_Node.HasAttribute(S) then
                  Caption_Text := XML_Node.Attributes[S];

                //Caption in die ListView schreiben
                Caption := Caption_Text;

                //Anzahl der SubItems aus der Datei lesen
                S := 'Count';
                If Assigned(XML_Node) and XML_Node.HasAttribute(S) then
                  Anzahl_SubItems := XML_Node.Attributes[S];

                If Anzahl_Subitems > 0 then
                  for j := 0 to Pred(Anzahl_SubItems) do
                    begin
                      S := 'SubItem' + IntToStr(j);
                      If Assigned(XML_Node) and XML_Node.HasAttribute(S) then
                        SubItem_Text := XML_Node.Attributes[S];

                      Items[i - 1].SubItems.Add(SubItem_Text);
                    end;

                //CheckBoxen aus Datei auslesen
                S := 'CheckBox';
                If Assigned(XML_Node) and XML_Node.HasAttribute(S) then
                  Bool_Check := XML_Node.Attributes[S];

                //CheckBox-Zustand in die Datei schreiben
                Items.Item[i - 1].Checked := Bool_Check;
              end;
        end;
    end;
end;
ich habe aber Probleme mit dem "DateiName" in den Codes.

Wenn ich dort einen Pfad wie z. B. "C:\Programme\test.xml" angebe, dann bekomme ich folgenden Fehler:

Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt FileUpdate.exe ist eine Exception der Klasse EDOMParseError aufgetreten. Meldung: 'Ein XML-Dokument muss ein Element der obersten Ebene enthalten.

Linie: 0
'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
Wenn ich haber nur "test.xml" schreibe, dann gehen die Codes. Nur wird die XML-Datei nicht dort hin gespeichert wo ich es gerne hätte (also z. B. C:\programme)

Weiss jemand, was bei den Codes falsch ist?
Würd nämlich gerne nen kompletten pfad angeben können.

Merci im Vorraus!
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: ListView laden/speichern mit XML

  Alt 30. Sep 2005, 19:21
Hallo Helmi,

selbstverständlich kannst du Pfadnamen an LoadFromFile() übergeben. An welcher Stelle genau in deinem Quelltext wird die Exception geworfen und was steht zu diesem Zeitpunkt in der angegebenen Datei?

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#3

Re: ListView laden/speichern mit XML

  Alt 30. Sep 2005, 19:41
Hallo marabu,

Zitat von marabu:
Hallo Helmi,

selbstverständlich kannst du Pfadnamen an LoadFromFile() übergeben.
So kenn ich es auch z. B. von Inifiles.

Die Datei hat 0 Byte und hat folgenden "Inhalt":
Zitat:
Die XML-Seite kann nicht angezeigt werden
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.


--------------------------------------------------------------------------------

Ein XML-Dokument muss ein Element der obersten Ebene enthalten. Fehler beim Bearbeiten der Ressource 'file:///G:/test.xml'.
Beim Laden hängt das Ganze hier:
Delphi-Quellcode:
{ ... }
      with FXMLDoc do
        begin
          LoadFromFile(DateiName);

          Options := [doNodeAutoIndent]; <===HIER
          Active := True;
{ ...}
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: ListView laden/speichern mit XML

  Alt 30. Sep 2005, 19:48
Du solltest nicht versuchen, eine leere Datei zu laden. Beim MS-XML-Parser gibt es die Möglichkeit, mit "loadXML" fertigen Code zu übergeben (in solchen Fällen wie Datei leer oder nicht vorhanden). Gibt es bei dieser XML-Komponente, die du nutzt, sicher auch irgendwie.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

Re: ListView laden/speichern mit XML

  Alt 1. Okt 2005, 09:04
Ich könnte mich selbst in den Arsch beissen!

Zuvor hatte ich die ListView in eine Text-Datei gespeichert und diese Textdatei im OnCreate des Fensters erzeugt.

Gestern ahb ich dann die Proceduren zum speichern/laden von ListViews von Text auf XML umgestellt aber vergessen, die Datei nicht mehr als Text-Datei erzeugen zu lassen.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  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 22:57 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