Hallo, ich nutze ein C# Windowsprogramm zur Eingabe von Parametern, welche im Mikrocontroller weiter verarbeitet werden. Der Anwender kann in mehrere Textboxen und Schieberegler Einstellungen vornehemen. Nun würde ich gerne eine Möglichkeit bereitstellen, wie man die eingegebenen Daten abspeichern und wieder laden kann, wenn das Programm mal geschlossen wird. Es handelt sich bei den Daten um bytes, integer und strings, sowie arrays. Ich bin recht neu auf dem Gebiet und würde mich über Hilfe sehr freuen ! Grüße
Hi, da gibt es zwei Ansätze. Entweder in eine Config- bzw. INI-Datei oder in die Registry. Der erste ist zwar veraltet, aber immer noch in Gebrauch, der zweite ist quasi Windows-"konformer". Beides lässt sich relativ einfach umsetzen, leider kann ich dir jetzt nicht genau sagen wie es geht, aber guck mal auf http://www.mycsharp.de im Forum, da findest du sicher, was du suchst. Ralf
Für die INI Dateien: GetPrivateProfileString SetPrivateProfileString u.a.
Kommt immer drauf an was das für Daten sind. Registry wurde ja schon genannt. Andere Möglichkeit: Datei auf, Werte reinschreiben, Datei zu Da kann man dann auch mehrere 'Konfigurationen' in verschiedenen Files aufbewahren, und der Benutzer kann isch dann die Laden, die er haben möchte.
"Der Datei auf, Werte reinschreiben, Datei zu"-Ansatz wird haeufig auch mit Serialisierung gekoppelt. Wenn Du bereits ein zentrales "Einstellungsobjekt" hast, kannst Du das damit 'direkt' in eine speicherbare Binaerkodierung (und zurueck) konvertieren.
Ich habe das jetzt so umgesetzt : Ich speichere die Dateien seriel in ein xml file ab: public void speichern() { XmlTextWriter myXmlTextWriter = new XmlTextWriter("test.xml",null ); // System.Text.Encoding.UTF8 myXmlTextWriter.Formatting = Formatting.Indented; myXmlTextWriter.WriteStartDocument(false); // myXmlTextWriter.WriteComment("This is a comment"); myXmlTextWriter.WriteStartElement("wert0"); myXmlTextWriter.WriteString(Convert.ToString(array[0])); myXmlTextWriter.WriteStartElement("wert1"); myXmlTextWriter.WriteString(Convert.ToString(array[1])); myXmlTextWriter.WriteStartElement("wert2"); myXmlTextWriter.WriteString(Convert.ToString(array[2])); myXmlTextWriter.WriteEndElement(); myXmlTextWriter.WriteEndElement(); myXmlTextWriter.Flush(); myXmlTextWriter.Close(); } Es werden hier die Inhalte von array [0] bis array [2] ind das xml-file geschrieben. Zum Laden werden die werte in der while-Schleife so lange ausgelesen, bis keiner mehr vorhanden ist und in wieder in den Array array[3] abgespeichert. der counter i dient dabei der Adressierung. public void laden() { i = 0; XmlTextReader reader = new XmlTextReader("test.xml"); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // Der Knoten ist ein Element. // label1.Text = "<" + reader.Name + (">"); break; case XmlNodeType.Text: //Anzeigen des Textes in jedem Element. array[i] = Convert.ToByte(reader.Value); //label2.Text = "wert:" + Convert.ToString(array[i]); i++; break; case XmlNodeType.EndElement: //Anzeigen des Endes des Elements. // label3.Text = "</" + reader.Name + ">"; break; } } Soweit funktioniert das, aber wenn ich eine große Datenmenge schicken mag, dann wird das viel Schreiberei.
achim wrote: > Soweit funktioniert das, aber wenn ich eine große Datenmenge schicken > mag, dann wird das viel Schreiberei. Du meinst beim Write... Wieso? Schon mal was von Schleifen gehört? Ausserdem würd ich ein Array nicht unbedingt so speichern, dass jeder Wert einen eigenen Tag hat, sondern alle Arrayelemente in einem Tag speichern. zb. mit Kommas trennen, so dass dein jetziges XML so aussehen würde <Werte>100,200,300</Werte> Sowas ist leicht zu erzeugen (einfach in einer Schleife an einen String immer wieder gegebenenfalls ein Komma und den nächsten Wert an einen String anhängen, den String dann als Ganzes aufs XML schreiben) und auch wieder leicht zu lesen. (Den gelesenen String an den Kommas in Einzelstrings splitten lassen und die Einzelteile weiterverarbeiten)
Ralf wrote: > Hi, > > da gibt es zwei Ansätze. Entweder in eine Config- bzw. INI-Datei oder in > die Registry. Der erste ist zwar veraltet, aber immer noch in Gebrauch, > der zweite ist quasi Windows-"konformer". > > Beides lässt sich relativ einfach umsetzen, leider kann ich dir jetzt > nicht genau sagen wie es geht, aber guck mal auf http://www.mycsharp.de > im Forum, da findest du sicher, was du suchst. > > Ralf Beides sollte in diesem Zusammenhang nicht verwendet werden. Den XmlTextWriter braucht man dazu auch nicht zu bemühen, da das Net Framework dafür ApplicationSettings kennt. Erzeugt man ein neues Projekt wird automatisch eine entsprechende Klasse erstellt, die man direkt verwenden kann (in der Projektmappe unter Properties Settings.settings, wo man u.a. auch neue Voreinstellungen erzeugen kann). Geladen werden die Einstellungen automatisch, nur das Speichern muss man selbst anstoßen (Settings.Default.Save()) Verwendung dann z.B. Settings.Default.Irgendwas = 1234; Nachtrag: Das ganze hat auch den Vorteil, dass man damit direkt Applikations- und Benutzervoreinstellungen erzeugen kann. Noch ein Nachtrag: Wenn man was eigenes machen will/muss, ist es wesentlich einfacher diese Voreinstellungen in eine eigene Klasse zu packen und z.B. als XML zu serialisieren (letztlich dasselbe, was die ApplicationSettings intern auch machen)
@ kbuchegg Das mit Schleifen habe ich nicht hinbekommen. Um aus dem XML die Daten wieder richtig auslesen zu können habe ich vor jedem Eintrag einen neuen Knoten erstellt: myXmlTextWriter.WriteStartElement("wert0"); myXmlTextWriter.WriteString(Convert.ToString(array[0])); myXmlTextWriter.WriteStartElement("wert1"); myXmlTextWriter.WriteString(Convert.ToString(array[1])); myXmlTextWriter.WriteStartElement("wert2"); myXmlTextWriter.WriteString(Convert.ToString(array[2])); Dieses kann ich nicht mit einer Schleife erledigen. Aber ich werde mir das nochmal schnauen. Wusste bis heute noch nichtmal was ein XML überhaupt ist ;-)
achim wrote: > myXmlTextWriter.WriteStartElement("wert0"); > myXmlTextWriter.WriteString(Convert.ToString(array[0])); > myXmlTextWriter.WriteStartElement("wert1"); > myXmlTextWriter.WriteString(Convert.ToString(array[1])); > myXmlTextWriter.WriteStartElement("wert2"); > myXmlTextWriter.WriteString(Convert.ToString(array[2])); > > Dieses kann ich nicht mit einer Schleife erledigen. Nicht ????? Was hindert Dich daran?
achim wrote: > myXmlTextWriter.WriteStartElement("wert0"); > myXmlTextWriter.WriteString(Convert.ToString(array[0])); > myXmlTextWriter.WriteStartElement("wert1"); > myXmlTextWriter.WriteString(Convert.ToString(array[1])); > myXmlTextWriter.WriteStartElement("wert2"); > myXmlTextWriter.WriteString(Convert.ToString(array[2])); > > Dieses kann ich nicht mit einer Schleife erledigen. Das ist aber seltsam. Vor allen Dingen weil so ziemlich alle Zutaten die du dazu brauchst, mit Ausnahme der Schleife selbst und der Verkettung von Strings schon dastehen for( i = 0; i < 3; ++i ) { String tag = "wert" + Convert.ToString( i ); myXmlTextWriter.WriteStartElement( tag ); myXmlTextWriter.WriteString( Convert.ToString( array[i] ) ); myXmlTextWriter.WriteEndElement(); } > Aber ich werde mir das nochmal schnauen. Wusste bis heute noch nichtmal > was ein XML überhaupt ist ;-) Das hat weniger mit XML zu tun, als mit der Fähigkeit sich einen String so zusammenbauen zu können, wie man ihn braucht.
Du machst Dir viel zu viel Arbeit. Speichere Deine Daten einfach in einem Struct bzw. in einer Klasse. Dann lass das .NET Framework die Arbeit tun. Das Zauberwort heisst serialisieren; mit etwa drei Zeilen Code ist es dann erledigt, egal wie komplex Deine Daten sind. Das Umgekehrte um die Daten wieder zurückzuholen heisst deserialisieren. Also such im Netz einfach mal nach "xml", "file", "serialize", ...
Johnny wrote: > Du machst Dir viel zu viel Arbeit. Speichere Deine Daten einfach in > einem Struct bzw. in einer Klasse. > Dann lass das .NET Framework die Arbeit tun. Das Zauberwort heisst > serialisieren; mit etwa drei Zeilen Code ist es dann erledigt, egal wie > komplex Deine Daten sind. Das Umgekehrte um die Daten wieder > zurückzuholen heisst deserialisieren. > Also such im Netz einfach mal nach "xml", "file", "serialize", ... Na ja, ich finde schon, dass ein Programmierer in der Lage sein sollte, selbst eine Datei zu lesen/schreiben. Spätestens dann, wenn deine gespeicherten Daten in einem anderem Programm widerverwendet oder manipuliert werden sollen(ev. sogar in einer anderen Programmiersprache), stehst du nämlich mit der Serialisierung schön dumm da. Been there, done that.
Ok meinetwegen. Ich frage mich zwar trotzdem, warum man eine .NET Applikation programmieren will, wenn man das .NET Framework nicht nutzen will, aber jedem das seine. Und wer das Rad neu erfinden will, nur zu ;-)
Karl heinz Buchegger wrote: > Na ja, ich finde schon, dass ein Programmierer in der Lage sein sollte, > selbst eine Datei zu lesen/schreiben. > > Spätestens dann, wenn deine gespeicherten Daten in einem anderem > Programm widerverwendet oder manipuliert werden sollen(ev. sogar in > einer anderen Programmiersprache), stehst du nämlich mit der > Serialisierung schön dumm da. Been there, done that. Deshalb auch XML, das könnte man zur Not auch noch problemlos mit einem externen Programm passend konvertieren. Aber wie oben schon gesagt, für das ursprüngliche Problem gibt's mit ApplicationSettings eine einfach zu benutzende Lösung im Framework, die XML benutzt.
Er denkt halt, dass richtige Programmierer alles noch "von Hand" selbst ausprogrammieren. Wahrscheinlich implementiert er nun gerade einen neuen XML Parser.
Johnny wrote: > Er denkt halt, dass richtige Programmierer alles noch "von Hand" selbst > ausprogrammieren. :-) Immerhin kann ich das noch und brauch niemanden der für mich vorarbeitet :-) > Wahrscheinlich implementiert er nun gerade einen neuen > XML Parser. Nö. Wozu? Sowas nimmt man fertig. Im Ernst: Sobald du darauf angewiesen bist, deine Datenfiles an irgend jemanden zu übergeben, bist du mit irgendwelchen proprietären Lösungen immer schlecht beraten. Deinen Quelltext rausgeben willst du mit Sicherheit nicht. XML ist schon eine gute Lösung, wenn der Overhead keine Rolle spielt. Wenn er es aber doch tut, was machst du dann? Dann holst du dir einen richtigen Programmierer, der kein Framework braucht um 3 Zahlenwerte in eine Datei zu speichern.
Aber Du machst ja eh eine C# Applikation unter .NET, also hast Du ja bereits alles. Von da her macht es wirklich keinen Sinn, nur Deines Dickschädels wegen keinen Gebrauch vom Framework zu machen, proprietär hin oder her. Bei .NET Programmierern ist es so, dass das Know-How vorallem in der guten Kenntnis des .NET Frameworks angesiedelt ist und nicht im Programmieren von Low-Level Dingen. Denn im Framework ist praktisch alles was man meistens braucht schon sehr effizient ausprogrammiert. Es macht keinen Sinn, nur Deines Stolzes wegen nochmals alles selber auszuprogrammieren, was bereits vorhanden ist, getestet ist und einwandfrei funktioniert. > Im Ernst: Sobald du darauf angewiesen bist, deine Datenfiles an irgend > jemanden zu übergeben, bist du mit irgendwelchen proprietären Lösungen > immer schlecht beraten. Genau da liegt ja der Vorteil von XML und was daran proprietär sein soll entzieht sich vollkommen meiner Kenntnis. Es ist eher proprietär, wenn Du selber versuchst die drei Zahlenwerte in ein File zu schreiben.
Wir reden aneinander vorbei. Ich versteh deinen Standpunkt durchaus, das Rad nicht neu erfinden zu wollen und das ist auch gut so. Auf der anderen Seite reden wir von einem Programmierer, der Schwierigkeiten damit hat 2 Strings miteinander zu verknüpfen um sich den Tag-Titel in einem XML Dokument zu generieren. Klar ist er mit deinem 3 Zeiler gut bedient. Er hat erst mal eine Lösung mit der er gut klar kommt und die ihm alle Arbeit abnimmt. Er verkauft sich dann als Programmierer bis er in eine Firma kommt, wo er dann ein Autocad DXF einlesen soll und mit großen Augen davor steht, weil er in seinem ganzen Leben noch nie ein File gelesen oder geschrieben hat. Aber Hauptsache er kann sich aus dem Framework die Teile zusammenklicken die er braucht. Das beherrscht er. Ein File lesen oder Schreiben zu können ist für mich Grundlagenwissen, das muss bei mir jeder Programmierer können, egal ob ihm später ein Framework diese Arbeit abnimmt oder nicht. Ditto für Stringmanipulationen. Übung ist in der Programmierung die halbe Miete. Die Welt da draussen ist voll mit 'Programmierern' die ausser sich aus einem Framework irgendwelche Klassen zusammenzuklicken nichts anderes können. Und dementsprechend sehen auch ihre Programme aus. Und ich hab keineswegs einen Feldzug gegen XML gestartet :-)
@ Karl heinz Buchegger 100% ack. Das sollte jeder können.
Danke schon mal für die vielen Antworten ! Ich muss sagen, dass ich es sehr zu schätzen weis, dass ich nach dem embedded c pogammieren mit dem Mikrocontroller eine durchaus einfache Sprache wie C# verwenden kann. Gerade hier finde ich den Vorteil, dass man eben das Rad nicht neu erfinden muss. Besonders wenn man kein Informatiker ist, dann kommt es haupsächlich auf das Ergebnis an. Grüße
Ich würde das ganze mit den dafür vorgesehenen Settings machen. Die speichern alles in XML und du brauchst dich um nichts zu kümmern. http://msdn.microsoft.com/de-de/library/aa730869(vs.80).aspx Grüße
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.