Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Save Dialog inkl. XML (https://www.delphipraxis.net/183511-save-dialog-inkl-xml.html)

StepByStep 16. Jan 2015 09:09

Delphi-Version: XE2

Save Dialog inkl. XML
 
Hallo zusammen,

ich habe das Internetz bereits durchsucht und nur wenige hilfreiche/verständliche Tipps erhalten.
Zu meinem Problem. Ich möchte eine XML-Datei speichern. Dies soll über einen SaveDialog geschehen.

Zur Zeit sieht das so aus:

Delphi-Quellcode:
Data.SaveToFile('Dateiname.xml');
Ich habe es jetzt folgendermaßen geändert:

Delphi-Quellcode:
procedure TXmlfunction.Save;
begin
  SaveDialog           := TSaveDialog.Create(nil);
  SaveDialog.Title     := 'XML speichern';
  SaveDialog.InitialDir := GetCurrentDir;
  SaveDialog.Filter    := 'XML|*.xml';
  SaveDialog.DefaultExt := 'xml';
  if SaveDialog.Execute then
  begin
    ShowMessage('Die Datei konnte gespeichert werden.');
  end
  else
  begin
    ShowMessage('Die Datei konnte nicht gespeichert werden.');
  end;
  SaveDialog.Free;
end;
Aber wenn ich meine Daten geschrieben habe, werden diese der bestehenden XML-Datei nicht hinzugefügt.
Auch eine neue Datei wird nicht angelegt - Wenn ich es nicht besser wüsste, würde ich sagen, ich mache was falsch.

Also Vorschau:
Ich möchte auch gerne noch einen OpenDialog - speichern ist mir aber gerade wichtiger.

Gruß
Jan

Daniel 16. Jan 2015 09:17

AW: Save Dialog inkl. XML
 
Dieser Dialog kapselt /ausschliesslich/ die Interaktion mit dem Benutzer und fragt diesem nach einem Pfad und Dateinamen - mehr nicht. Speichern musst Du selbst. Du bist im Prinzip an der richtigen Stelle - denn dort, wo Du derzeit die ShowMessage('XML gespeichert') anzeigst, musst Du es nur tun. Über die Eigenschaft SaveDialog.Filename bekommst Du den Datennamen, den der Anwender gewählt hat.
:-)

StepByStep 16. Jan 2015 09:30

AW: Save Dialog inkl. XML
 
Danke dir. Das Problem wurde gelöst, dachte nicht, dass es so schnell geht. :)

Gruß
Jan

DeddyH 16. Jan 2015 09:32

AW: Save Dialog inkl. XML
 
Hat immerhin 8 Minuten gedauert :-D

StepByStep 16. Jan 2015 10:00

AW: Save Dialog inkl. XML
 
Ich hab da irgendwie ein Problem... es nennt sich Exception.

Also ich mache folgendes:

Im "OnCreate" meiner Hauptform rufe ich den Befehl
Delphi-Quellcode:
Xmlvalue.Open;
auf.

Delphi-Quellcode:
procedure TXmlfunction.Open;
begin
  OpenDialog           := TOpenDialog.Create(nil);
  OpenDialog.Title     := 'Datei auswählen';
  OpenDialog.Options   := [ofFileMustExist];
  OpenDialog.InitialDir := GetCurrentDir;
  OpenDialog.Filter    := 'XML|*.xml';
  if OpenDialog.Execute then
  begin
    Data       := Xml.XMLDoc.LoadXMLDocument(OpenDialog.FileName);
    firstchild := Data.ChildNodes['Arbeitszeiterfassung'];
    secondchild := firstchild.ChildNodes['Arbeitszeit'];
    Xmllist    := TObjectlist<TList>.Create;
    repeat
      Xmllist.Add(TList.Create(secondchild.ChildNodes['Nummer'].Text, secondchild.ChildNodes['Von'].Text,
        secondchild.ChildNodes['Bis'].Text, secondchild.ChildNodes['Dauer'].Text,
        secondchild.ChildNodes['Stichwort'].Text, secondchild.ChildNodes['Summe'].Text));
      secondchild := secondchild.NextSibling;
    until secondchild = nil;
    ShowMessage('Die Datei wurde geladen.');
  end
  else
  begin
    Data         := NewXMLDocument;
    Data.Encoding := 'utf-8';
    firstchild   := Data.AddChild('Arbeitszeiterfassung');
    ShowMessage('Die Datei konnte nicht geladen werden.');
  end;
  OpenDialog.Free;
end;
Das soll eigentlich dafür sorgen, dass wenn ich keine bestehende Datei auswähle, eine neue erstellt wird.
Ich trage anschließend etwas in Editfelder und drücke auf speichern:

Delphi-Quellcode:
Xmlvalue.AddChild(Von_E.Text, Bis_E.Text, Stichwort_E.Text);
Dort in der Funktion werden die Daten übernommen und anschließend steht dort zum Schluss:

Delphi-Quellcode:
Save;
was mich an meinen SaveDialog weiterleitet:

Delphi-Quellcode:
procedure TXmlfunction.Save;
begin
  SaveDialog           := TSaveDialog.Create(nil);
  SaveDialog.Title     := 'XML speichern';
  SaveDialog.InitialDir := GetCurrentDir;
  SaveDialog.Filter    := 'XML|*.xml';
  SaveDialog.DefaultExt := 'xml';
  if SaveDialog.Execute then
  begin
    Data.SaveToFile(SaveDialog.FileName);
    ShowMessage('Die Datei konnte gespeichert werden.');
  end
  else
  begin
    ShowMessage('Die Datei konnte nicht gespeichert werden.');
  end;
  SaveDialog.Free;
end;
Ich habe ein bestehendes XML-Dokument, das möchte ich aber nicht überschreiben, sondern ein neues erstellen. Also trage ich einen anderen Namen ein.
Ohne etwas zu machen kam dann eine Readofadress-exception - warum? :?:

Daniel 16. Jan 2015 10:06

AW: Save Dialog inkl. XML
 
Zitat:

Zitat von StepByStep (Beitrag 1286683)
Ohne etwas zu machen kam dann eine Readofadress-exception - warum? :?:

Aus der Ferne schwer zu sagen. Vermutlich wirst Du irgendwas gemacht haben, sonst gäbe es keine Exception. ;-)
Wenn ich mir das da oben angucke, dann liegt der Fehler - vermutlich - im Bereich Deiner XML-Behandlung, weniger beim Speichern an sich.
In welcher Zeile fliegt er Dir denn weg? Wenn Du Dein Programm aus der IDE heraus startest, sollte der Debugger an der fehlerhaften Stelle stehen bleiben.

StepByStep 16. Jan 2015 10:13

AW: Save Dialog inkl. XML
 
Alles klar, ich Genie wollte eine nicht beschriebene Liste ausgeben. :oops:

Gruß
Jan


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