Einzelnen Beitrag anzeigen

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