Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi ListView laden/speichern mit XML (https://www.delphipraxis.net/54259-listview-laden-speichern-mit-xml.html)

Helmi 30. Sep 2005 19:08


ListView laden/speichern mit XML
 
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!

marabu 30. Sep 2005 19:21

Re: ListView laden/speichern mit XML
 
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

Helmi 30. Sep 2005 19:41

Re: ListView laden/speichern mit XML
 
Hallo marabu,

Zitat:

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;
{ ...}

MathiasSimmack 30. Sep 2005 19:48

Re: ListView laden/speichern mit XML
 
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.

Helmi 1. Okt 2005 09:04

Re: ListView laden/speichern mit XML
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 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