Datei speichern und speichern unter...

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Parmaster.

    Datei speichern und speichern unter...

    Hallo!

    Es geht immer noch um mein Programm "Messwerterfassung", welches wir als Projekt für die Schule machen. Ich habe vorgeschlagen, aus dem Konsolenprogramm ein WinForms Programm zu machen, und da wir sowieso demnächst damit anfangen, hatte der Lehrer auch nichts dagegen.
    So weit, so gut.

    Jetzt stehe ich vor einem Problem, das mich irgendwie verwirrt.

    Ich kenne das bisher so, das man ein neues Objekt vom StreamWriter erzeugt, die Ausgabe oder was auch immer reinschreibt, und dann wieder schließt.

    Jetzt würde ich gern, wie man das halt so kennt, in meinem Programm, die Funktionen "Speichern" und "Speichern unter..." anbieten.

    Das "Speichern unter..." hab ich bereits mit SaveFileDialog, aber mir sind irgendwie manche Sachen nicht ganz klar, wie z.B.:

    1. brauch ich jetzt immer noch StreamWriter? (kann ich mir nicht vorstellen)
    2. wenn ja, wann soll das erzeugt werden? Sobald mit dem SaveFileDialog eine vorhandene Datei ausgewählt wurde bzw. eine neue erstellt wurde?
    3. wie funktioniert das mit "Speichern" genau? Also es soll so sein wie man es halt aus anderen Programmen kennt, das man im Menü drauf klickt (oder auch per CTRL+S), und den momentan vorhandenen Zustand der vorher per "Speichern unter" ausgewählten Datei speichert. Wie macht man sowas?

    Ich hab auch schon danach gesucht, aber speziell zu "Speichern" nicht wirklich was gefunden (oder falsch gesucht).

    Kann mir jemand Links oder Tipps dazu geben?
    zwischen speichern und speichern unter... gibt es keinen Unterschied - es wird gespeichert.
    Nur bei Speichern unter ist zuvor noch der SaveFile-Dialog auszuführen, damit der User neu eingeben kann, wo.

    also wenn du speichern unter bereits fertig hast, verstehe ich die Frage nicht, weil dass du dann nur das Öffnen des FileSaveDialogs weglassen musst - würde ich sagen - sollte doch jeder von allein drauf kommen.
    Hab mich vielleicht falsch ausgedrückt mit "fertig". Habe es bisher nur eingebaut, machen tut es noch nichts.

    Du sagst, es ist der gleiche Vorgang, aber wie bekomme ich die ausgewählte Datei von "Speichern unter..." nach "Speichern"? Es sind ja zwei verschiedene Buttons, also dementsprechend zwei Subs. Das ist mir irgendwie nicht ganz klar.
    Na, in den jeweiligen Subs musste das halt anpassen. Mach Dir halt ne globale Variable/Eigenschaft vom Typ String und frage beim Speichern-Button ab, ob diese nen Inhalt hat. Wenn nicht, dann wurde noch kein Pfad festgelegt. Dann rufst Du halt die Sub fürs "Speichern unter..." auf.

    Dort zeigst Du mit nem Using-Block nen SaveFileDialog an und dann speicherst Du die Datei da mit nem FileStream und trägst am Ende den Wert der FileName-Eigenschaft in die Variable/Eigenschaft, die Du festgelegt hast, ein. Dann kannst Du, wenn man wieder auf "Speichern" klickt, dies halt abfragen und wenn es nen Inhalt hat (wurde also schon festgelegt der Pfad), dann halt einfach in die Datei schreiben.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Parmaster Du brauchst genau eine Routine, die die Daten speichert, Wie genau das passiert, ist von den Daten selbst abhängig. INI (ist eigentlich out aber hi und da nützlich), XML am besten mit einem typisierten DataSet, als Struktur in einem Binary File oder als serialisierte Klasse.
    Wenn Du vorhandene Daten überschreibst, genügt ein Knopfdruck. Wenn Du dem User Gelegenheit geben willst, unterschiedliche Konfigurationen zu speichern, nimm Speichern Unter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich ehrlich bin, bin ich jetzt auch nicht schlauer als vorher. :(

    @Trade
    macht man das wirklich mit globalen Variablen?

    Und das mit dem Using Block kenn ich nicht. Kannste mir mal ein kurzes Beispiel zeigen wie man das nutzt?


    @RodFromGermany

    es ist eine CSV Datei die gespeichert werden soll. Der Benutzer soll ja beide Möglichkeiten bekommen, zu mal die Messwerte auch im Millisekundentakt reinkommen können, und der Benutzer die Möglichkeit haben soll, zwischendurch zu speichern.


    Also im Prinzip genauso wie man es halt auch von Word/Excel/usw. kennt.

    Parmaster schrieb:

    macht man das wirklich mit globalen Variablen?

    Wieso nicht? Kannste halt oben in Deiner Klasse deklarieren und dann in der ganzen Klasse nutzen. Notfalls nimmste halt Eigenschaften/Properties.

    Parmaster schrieb:

    Und das mit dem Using Block kenn ich nicht. Kannste mir mal ein kurzes Beispiel zeigen wie man das nutzt?

    Klar, aber notfalls kann man da auch immer bei MSDN nachschauen.

    Beispiel:

    VB.NET-Quellcode

    1. Using sfd As New SaveFileDialog
    2. If sfd.ShowDialog = DialogResult.OK Then ' Igitt, VB-Style :D
    3. ' Hier auswerten
    4. End If
    5. End Using
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Parmaster schrieb:

    nicht schlauer als vorher.
    Stell eine konkrete Frage.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Stell eine konkrete Frage.


    Hab ich schon, sogar zwei mal.

    Mir geht es speziell um den "Speichern" Button. Der soll halt genauso funktionieren wie man es von anderen Anwendungen kennt wie z.B. Word. Es soll halt der momentane Zustande gespeichert werden, und zwar in die Datei die vorher mit "Speichern unter" festgelegt wurde.
    Ja, und wo ist das Problem? Ich habe Dir bereits gepostet, wie Du es machen musst, sogar mit Code teils.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Parmaster schrieb:

    festgelegt wurde
    Da brauchst Du 2 Flags:
    1. Modify
    2. Saved
    Button-Save-Klick mit folgenden Möglichkeiten:
    Modify = False AndAlso Saved = False => Save As
    Modify = False AndAlso Saved = True => nix tun
    Modify = True AndAlso Saved = False => Save As
    Modify = True AndAlso Saved = True => Save
    Button-Save-As-Klick: Immer Save As.
    Save As bedeutet, dass Du den SaveFileDialog aufrufen musst.
    -----
    Mit "Speichern unter" wird keine Datei festgelegt, sondern es werden die relevanten Daten unter dem vorgegebenen Dateinamen gespeichert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    also ich hab ja immer einen FileSaveDialog aus der Toolbox auffm Form.
    Und der enthält ja den Speicher-Ort.
    1) Wenn ich nun also nur speicher, dann speicher ich nur, und ich speicher an den Ort, den ich dem FileSaveDialog entnehme - ohne dass ich ihn überhaupt geöffnet habe.
    2) Wenn ich aber saveAs speicher, dann öffne ich ihn halt vorher noch, und weiter gehts mit 1)
    So, das hab ich nun hinbekommen.

    Ich kann nun eine CSV Datei in ein DGV laden, und die Daten aus einem DGV wieder in eine CSV Datei speichern.

    Nun habe ich aber gelesen, dass man das gar nicht machen soll, und ich sowieso ein DataSet brauche für das ChartControl.

    Also hab ich mir ein DataSet (eine .xsd Datei, hoffe das ist das richtige) angelegt, und versuche nun die ganze Zeit die CSV in das DataSet zu importieren. Ich habe schon viel probiert, aber entweder werden nur die Header importiert, oder es kommt ein Fehler wegen ungültigem Objektverweis (genaue Fehlermeldung weiß ich grad nicht).

    Kann mir bitte mal jemand anhand von einem Pseudocode zeigen wie man es richtig importiert und auch wieder speichert als CSV?


    PS: passt das Thema mit dem DataSet noch hier rein? Oder hätte ich besser ein neues Thema anfangen sollen?
    Ja, so in etwa hab ich mir das dann auch gedacht. Also während der Laufzeit hab ich mich CSV überhaupt nichts zu tun, sondern speichere das dann nur am Schluß nochmals als CSV, mehr nicht. Mal sehen wie man aus einer XML eine CSV macht, aber da gibt es bestimmt auch was.

    Aber jetzt muss ich doch noch mal fragen, wie ich überhaupt die Daten in die XML bekomme. Ich habe 3 Spalten, in der ersten steht nur der Zeitstempel, in der zweiten steht die Temperatur in °C und in der dritten die Temperatur in °K.
    Die Temperatur ist eine zufällige Zahl, also keine echte Messwerte (im Moment, kann sich noch ändern).
    Jetzt ist meine Frage, ob ich nun die Werte in das DGV schreibe, und dann von dort in das XML, oder kommen die Daten direkt ins XML, und das DGV zeigt die nur noch an? Mir ist gerade die Reihenfolge nicht klar.

    Und, wie mache ich jetzt aus dem DataSet die XML?

    Ich blick grad nicht durch. :(

    Parmaster schrieb:

    und in der dritten die Temperatur in °K
    1. K, nicht °K
    2. wenn die Celsiuis- und die Kelvin-Temperatur denselben Wert benennen, ist das redundant, da brauchst Du nur einen von.
    Und schon haben wir nur noch 2 Spalten, die lassen sich noch ganz anders behandeln.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades:
    Wahrscheinlich stell ich mich einfach nur blöd an, aber irgendwie kann ich mir gar nicht vorstellen dass es das gewesen sein soll. Nur mit Dataset.WriteXml wird doch nicht das XML gefüllt, da fehlen doch noch Parameter, wie z.B. welches Dataset usw., oder etwa nicht?


    @RodFromGermany

    wieso nur noch zwei Spalten? Ich hab nur eine Temperatur, der andere ergibt sich ja, aber angezeigt werden soll der schon auch.

    Edit by ErfinderDesRades: Post verbessert (hoffentlich)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()