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!