Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Daten m. Zeilenummbr einer Listbox bzw. Stringlist speichern


HeftCD - Mo 26.07.10 11:49
Titel: Daten m. Zeilenummbr einer Listbox bzw. Stringlist speichern
Hallo,

mal eine Frage:

Ich möchte Daten in einer Listbox/Stringliste sammlen und später in einer Dateiabspeiechern.
Allerdings enthalten die Listboxeinträge mitunter Zeilenumbrüche, da ich sie im Memo-Feld eingetippt und dann den aktuellen Memoinhalt jeweils an die Listbox geadded habe.
Folglich hat das noch #13#10 drin.

Gibt es eine Möglichkeit, die Daten ohne Codierung [Base64, Asutauschen von #13#10 gegen andere Symbole, etc.] vor dem Adden in die Liste) die Liste abzuspeichern?

Ich möchte die abgespeicherte Liste auch im Notfall mit notepad anzeigen und ohne Datenverlust/Beschädigung direkt bearbeiten und speihern können.

folgender Code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormCreate(Sender: TObject);
begin
listbox1.items.add('Maximizer'+#13#10'Tastenante' +#13#10 + 'Galloway');
listbox1.items.add('Wecker'+#13#10'Matritze');
ListBox1.items.SaveToFile ('.\Test.txt');
end;


erzeugt nur eine Textdatei mit folgendem Inhalt:
Zitat:
Maximizer
Tastenante
Galloway
Wicker
Matritze
(also ein paar Zeilenumbrüche zu viel => und damit Probleme beim späteren Einlesen)

Was kann man also tun?


Xion - Mo 26.07.10 12:11

user profile iconHeftCD hat folgendes geschrieben Zum zitierten Posting springen:

Gibt es eine Möglichkeit, die Daten ohne Codierung [Base64, Asutauschen von #13#10 gegen andere Symbole, etc.] vor dem Adden in die Liste) die Liste abzuspeichern?


Logisch überlegt, nein. Entweder der Zeilenumbruch wird durch etwas ersetzt, oder er ist noch da. Die Frage ist was du genau vor hast.

http://www.stefan-lenz.ch/_pics/68/ascii.png

Du könntest z.B. das #13#10 durch Zeichen 244 ersetzen. Dann weiß eigentlich jeder was gemeint ist. <br> oder sowas ist auch ok.

Gegenfrage: Wie soll die Textdatei denn aussehen? Die entsprechenden Zeilenumbrücke durch Leerzeichen erstetzt bzw ganz entfernt? Du kannst dann nur die erlaubten Eingaben verändern. z.B. werden 2 Leerzeichen immer als Zeilenumbruch gewertet, dann darf natürlich in der Eingabe des Users nicht 2mal Leerzeichen eingegeben werden.

Ansonsten kannst du noch auf ein andres "Medium" ausweichen, z.B. ne extra Datei, wo du speicherst wo die Zeilenumbrüche hingehören. Wird die andre verändert, wirds natürlich knifflig.

Edit: Wenn du mit Notepad drin rumwursteln wirst ist es meines Wissens nicht möglich, irgendwelche Formatierungen in der Art zu speichern, dass Notepad sie nicht anzeigt, denn Notepad zeigt einfach alle Zeichen an, ohne jede Formatierung. Wenn ich micht nicht täusche...ich hab nur WordPad und Editor bei mir aufm Rechner...


HeftCD - Mo 26.07.10 12:23

Was ich vorhabe?

ich möchte per Memo z.B. einzelne Sätze eingeben, oder Wortgruppen.
Und diese sollen durch Listeneinträge gruppiert verwaltet werden, als separater Datensatz.
Aber diese Datensätze sollen nicht weiter vermischt werden, - was aber die Speicherung Liste.SaveToFile() verursacht/damit macht.
D.h., wenn ich die einzlnen Datseätze einlese, bekomm ich plötzlich völlig unstrukturierte Zeilenumbrüche. => totales durcheinander.

naja, also im memo haben Galloway und Wecker nichts mit einander zu tun.
Sind quasi wie eigene Datensätze.
z.B:
Maximizer Tastenante Galloway
Wicker Matritze

Mhh, OK, ich könnte sie noch XOR verknüpfen ... wobei dann Kollisionen immer noch nicht auszuschließen sind.

Das mit dem Pi Zeichen ¶ scheint mir eine günstige Lösung.
Weiß jemand wie man das mit möglichst schnellem Code ersetzt?
Stringreplace() habe ich bei Delphi3 Pro noch nicht.
Allerdings weiß ich auch nicht, ob das bei nem "Datensatz2 von bis zu 2-3 kb Text so schnell ist.
Gibt es da schon fertigen schnellen Code zum Ersetzen?


Xion - Mo 26.07.10 12:53

user profile iconHeftCD hat folgendes geschrieben Zum zitierten Posting springen:
Was ich vorhabe?

ich möchte per Memo z.B. einzelne Sätze eingeben, oder Wortgruppen.
Und diese sollen durch Listeneinträge gruppiert verwaltet werden, als separater Datensatz.
Aber diese Datensätze sollen nicht weiter vermischt werden, - was aber die Speicherung Liste.SaveToFile() verursacht/damit macht.
D.h., wenn ich die einzlnen Datseätze einlese, bekomm ich plötzlich völlig unstrukturierte Zeilenumbrüche. => totales durcheinander.


Ich würde mich da nicht so die Listbox orientieren.

Wie wärs folgendermaßen:

Delphi-Quelltext
1:
var Daten: array of array of String;                    


Damit baust du sozusagen ein StringGrid auf. Du hängst also erstmal nicht die einzelnen Eingabe aneinander, sondern packst sie in separate Arrayfelder. Du kannst dann immernoch jederzeit die zusammenfügen und in einer ListBox anzeigen.

Zum speichern empfehle ich dir AssignFile, das ist richtig schnell (im Vergleich zur ListBox) oder auch TIniFile (da kannst du dir auseinanderlegen beim einlesen sparen). In der Ini-File musst du die Zeilenumbrüche auch ersetzen, bei AssignFile kannst du einfach alles reinpasten und dann ein Trennzeichen einfügen, das jetzt eine neue Zelle beginnt.

Achja, das ginge auch mit der Listbox:
Du speicherst von Hand, und haust ein Trennzeichen nach jeder Zeile der Listbox rein. Dann kannst du später mit Pos/Copy das rauslesen. Aber Achtung: Das Trennzeichen darf natürlich nicht im normalen Text vorkommen (ist ja immer so). Und das ganze schön schnell mit AssignFile. Das heißt glaub ich bei Delphi7 und früher noch Assign. Ich kann dir noch was dazu schreiben, wenn dus so machen willst.