![]() |
CD-Liste in Datei schreiben
Hallo,
habe wieder ein Problem beim entwickeln meiner Musik-CD-Verwaltung. Ich will meine CDs, die folgend strukturiert sind...
Delphi-Quellcode:
...und in einer Objectlist, die sich "cdList" nennt gespeichert werden, einzeln in eine Datei schreiben:
type
TCd = class(TObject) interpreter : string; albumTitle : string; genre : string; songTitles : TStringList; private procedure setValues(interpreter, albumTitle, genre : string);
Delphi-Quellcode:
Das Schreiben scheint zu klappen, da das folgende Öffnen:
//speichert CD-Liste in Datei
procedure TForm1.saveCdListToFile(fileName : TFileName); var f : file of TCd; i : integer; wCd : TCd; begin assignFile(f, fileName); reWrite(f); for i := 0 to cdList.count - 1 do begin //kein create notwendig!!! wCd := TCd(cdList[i]); write(f, wCd); end; closeFile(f); end;
Delphi-Quellcode:
auch funktioniert. Jedoch nicht mehr nach Neustart des Programs. Dann bekomme ich, wenn überhaupt, nur wirkürlich
procedure TForm1.Oeffnen1Click(Sender: TObject);
var f : file of TCd; i : integer; rCd : TCd; begin with openDialog1 do if execute then begin assignFile(f, fileName); reset(f); // cdList.free; // cdList := TObjectList.create; // cdList.clear; for i := 0 to fileSize(f) - 1 do begin //seek(f, i); //rCd := TCd.Create; read(f, rCd); cdList.add(rCd); end; closeFile(f); end; fillStringGrid; end; Daten. Woran liegt es? Ich hab genau gedebuggt, komischerweise schreibt er, obwohl er genau die richtige Zahl an Datensätzen aus der Datei liest, nichts in die Variable rCd. Wenn ich das auskommentierte einbaue, funktioniert es auch nicht. Auch beim cdList.clear-Aufruf den ich ja eigentlich brauche, damit beim Lesen ohne Neustart des Programs nicht alles 2 mal in der Liste steht. Mein größeres Problem ist jedoch, dass er halt wie gesagt nach Neustart scheinbar nur Müll aus der Datei liest. |
Re: CD-Liste in Datei schreiben
Hallo,
Irgendwie hab ich den Code nicht ganz durchblickt :roteyes: :stupid: Aber im ernst. Ist es wirklich Sinnvoll, Klassen in die Datei zu speichern? Bzw. Strings, die nicht in der Größe festgelegt sind? PS: Muß nicht alles stimmen, was ich daherquassle, bin noch sehr müde... :cat: |
Re: CD-Liste in Datei schreiben
Wie denn sonst? Mit Records? Wir leben doch schon lange im Zeitalter der Objekt-orientierten Programmierung.
Die Größe begrenzen will ich eigentlich nicht. Wo hast du denn Probleme im Code? Ich seh grade ganz oben fehlt was:
Delphi-Quellcode:
Auch wenn die prozeduren nicht relevant sind...Wenn ihr das braucht, hier der Code zum "erstellen" einer CD:
type
TCd = class(TObject) interpreter : string; albumTitle : string; genre : string; songTitles : TStringList; private procedure setValues(interpreter, albumTitle, genre : string); procedure addTitle(songTitles : TStringList); end;
Delphi-Quellcode:
//Button "CD hinzufuegen"
procedure TForm1.Button1Click(Sender: TObject); begin cd := TCd.create; //erstelle pro CD neues Objekt cd.setValues(edit1.text, edit2.text, edit3.text); //Interpret, etc. eintragen cdList.add(cd); //CD in Liste hinzufügen with stringGrid1 do begin //CD in StringGrid einfügen cells[0, rowCount - 1] := intToStr(rowCount - 1); cells[1, rowCount - 1] := cd.interpreter; cells[2, rowCount - 1] := cd.albumTitle; cells[3, rowCount - 1] := cd.genre; rowCount := rowCount + 1; //StringGrid um neue Zeile erweitern end; //Markierung aufheben stringGrid1.selection := TGridRect(Rect(-1, -1, -1, -1)); end; |
Re: CD-Liste in Datei schreiben
Ich würde das mit Record's machen
zB:
Delphi-Quellcode:
Mit der Methode, wie Du sie verwendest, speicherst Du nur die Adresse der Variable, statt dessen Inhalt.
type
TCD packed record interpreter:string; albumTitle :string; genre :string; songTitles :string; // TStringList.Text verwenden end; Sinnvoller wäre es, da Du ohnehin nur Strings speicherst, diese einzel in die Datei zu schreiben. Edit: Klasse natürlich. |
Re: CD-Liste in Datei schreiben
Hmm, gibts da nicht auch probleme, wegen nicht fester Stringgröße.
Außerdem soll ich strikt objektorientiert programmieren. Und records...naja... |
Re: CD-Liste in Datei schreiben
schonmal was von XML gehört?
Ich würde alle Klassen als XML speichern. Da bist Du frei, kannst jederzeit neue Felder hinzufügen, hast keine Größenbeschränkungen usw. |
Re: CD-Liste in Datei schreiben
Ja, würde es geben, wie ich ja oben schon sagte.
Ein Beispiel, was ich meinte.
Delphi-Quellcode:
Dann gibt's mit der Stringlänge keine Probleme.
procedure Save;
var F:TextFile; begin AssignFile(F, 'FileName'); ReWrite(F); Writeln(F, wCD.interpreter); Writeln(F, wCD.albumTitle); Writeln(F, wCD.genre); Writeln(F, wCD.songTitles); // TStringList.Text; CloseFile(F); end; PS: Schutzblöcke nicht vergessen :wink: |
Re: CD-Liste in Datei schreiben
XML? Ne, das kann ja nicht dein Ernst sein...
Und wenn, wie soll das gehen? Ich wollte schon bei "normaler" FileIO bleiben... @Sunligth7: Wie separiert TStringList.text den String denn? DA muss es ja n Token dazwischen geben, ich muss doch unterscheiden können, ob da n Leerzeichen kommt oder ein neuer Songtitel. Außerdem muss ich irgendwie die grenze zur nächsten CD ziehen, du speicherst nämlich nur eine... |
Re: CD-Liste in Datei schreiben
na, aber wenn Du writeln(wCD.songTitles) aufrufst, was passiert dann? Dann wird jedenfalls nicht die stringliste geschrieben.
wenn du writeln(wCD.songTitles.Text) aufrufst, dann wird sie zwar geschrieben, du hast aber keine ahnung wo sie endet. Wie gesagt: Mach es mit XML. Die Datei könnte dann so aussehen: <cdliste> <cd interpret="Skream" title="Skream!" genre="Dubstep"> <title nr="1" title="Tortured Soul"></title> <title nr="2" title="Midnight Request Line"></title> ... </cd> ... </cdliste> |
Re: CD-Liste in Datei schreiben
übrigens würde ich die ganze geschichte nochmal neu überdenken. du brauchst meiner meinung nach folgende Klassen:
TInterpret (Name, Land, Ort, ...) TInterpreten (enthält alle Interpreten) TLabel (Name, Website, ...) TLabels (enthält alle Labels) TTitel (Interpret, Titel, Label, Jahr, ...) TTracklisting (enthält mehrere Titel) TCD (CDTitel, Tracklisting, Erscheinungsjahr, ...) TCDs (enthält alle CDs) Etwa so. Und wenn Du das als XML speicherst wirst Du später mal (wenn Dein Wissen gewachsen ist) viele Vorteile haben. Alternativ (und besser noch) nimmst Du gleich eine Datenbank zum Speichern. |
Re: CD-Liste in Datei schreiben
Man könnte natürlich einen "Grenzstring" einfügen.
Wenn Du es aber genaus lädst, wie es gespeichert wird, dann gibt's keine Probleme. So eine ähnliche Speicherung hab ich auch mal geschrieben. Man könnte noch die Steuerzeichen von StringList.Text (#13#10) ändern, dann würde es in der Datei in einer Zeile stehen. Zitat:
Wenn man vorher wCD.songTitles den Text der StringListe zuweist. |
Re: CD-Liste in Datei schreiben
Zitat:
Ich hab's jetzt nicht ausprobiert, bin aber ziemlich sicher. Ihr könnt's ja ausprobieren wenn ihr mir nicht glaubt. |
Re: CD-Liste in Datei schreiben
Und was ist TStringList.Text?
Ein String :roll: Edit: Da ich TStringList.Text öfters nutze weiß ich, das das funktioniert. Probier mal das:
Delphi-Quellcode:
MyList.Text:='Zeile 1'#13#10'Zeile 2'#13#10'Zeile 3';
ShowMessage(MyList[0]); |
Re: CD-Liste in Datei schreiben
danke, danke erstmal, werde heute oder morgen sämtliche vorschläge von euch probieren...
|
Re: CD-Liste in Datei schreiben
Ja, aber Du hast nicht von songTitles.Text gesprochen sondern von songTitles. Und lies Dir meinen Beitrag nochmal durch - da schreibe ich doch, dass es mit songTitles.Text geht, dass man als Problem nur hat, dass man nicht weiß wie lang der String ist (weil er über mehrere Zeilen gehen kann).
Zitat:
|
Re: CD-Liste in Datei schreiben
Zitat:
Deshalb hab ich ja dazu geschrieben "// TStringList.Text verwenden"... Ich hoffe, jetzt ist alles klar?! Edit: @stevewilson Natürlich kannst Du das dann auch in die Klasse so übernehmen. Zu empfehlen ist es, die Steuerzeichen zu ändern. Zb. Hab ich bei meinem Programm die #13#10 mit '¤¤' ersetzt, so steht der Text in einer Zeile. Beim lesen wieder '¤¤' in #13#10 ändern... |
Re: CD-Liste in Datei schreiben
Okay, ich hab mich mit meinem Post auf die ursprüngliche Klassendefinition bezogen, nicht auf Deinen Record.
Natürlich ist die ursprüngliche Klassendefinition wesentlich besser als der Record!! Wir leben in 2006, nicht in 1994. Ich bin schon vor Jahren dazu übergegangen, keine Records mehr zu benutzen und habe es weder vermisst noch bereut. Und da Steve ja unbedingt objektorientiert programmieren soll, steht record hier eh nicht zur Debatte. |
Re: CD-Liste in Datei schreiben
Gut, dann warten wir mal, was stevewilson daraus bastelt :coder:
Hatte den vorherigen Beitrag noch erweitert, der Rote Kasten fehlte, wieder mal, deshalb hab ich Deinen erst nachher gesehen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz