Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Unicode: Widestring innerhalb eines Datenrecords
Gagamba - Di 28.08.12 09:05
Titel: Unicode: Widestring innerhalb eines Datenrecords
Hallo,
ich stelle grade von Delphi7 auf Delphi9. Dabei gibt es jetzt (wie erwartet) Probleme mit Unicode bzw. Widestring.
einfaches Codebeispiel:
Delphi-Quelltext
1: 2: 3: 4: 5:
| TYPE Datenrecord = RECORD Name : STRING; Jahr : INTEGER; END; VAR AlleDaten : ARRAY [1..MaxDaten] OF Datenrecord; |
Das Sichern/Laden geht standardmäßig über eine Datei
Delphi-Quelltext
1:
| VAR Datenfile : FILE OF Datenrecord |
die konventionell-sequentiell gelesen bzw. geschrieben wird
Unter Delphi9 wwerden die Strings allerdings nicht mehr in fixer Länge abgespeichert, sondern in ihrer tatsächlichen Länge, was dazu führt, dass die Dateigröße sich laufend ändert, und die Hintereinander-Schachtelung innerhalb des Arrays völlig durcheinander kommt!
Unter Delphi7 war String=Shortstring (wenn man ihn nicht umdefiniert hat), jetzt ist es zwingend Widestring. Da auch Chinesen Namen haben, sollte man den Widestring nutzen, also STRING lassen (sonst könnte man die Definition auf STRING[255] o.ä. ändern und hätte keine Probleme).
Wie löse ich das, ohne Texte und Daten voneinander trennen zu müssen? Eine Trennung stelle ich mir so vor, dass die Namen in einer TStringlist definiert werden, und auch mit deren Methoden gelesen und gesichert werden. Aber wie gesagt, möchte ich diese Trennung nicht machen..
Vielleicht isses ganz einfach, und ich steh nur auf dem Schlauch?
allerherzlichsten Dank im Voraus: Siegfried
Moderiert von
Martok: Delphi-Tags hinzugefügt
jaenicke - Di 28.08.12 10:48
Records mit fester Länge sind zur Datenspeicherung nur eine Krücke aus uralten Zeiten. Früher haben auch Datenbanken (BDE --> DBase, ...) so gearbeitet.
Heute wäre es besser das ganze richtig zu lösen. Entweder (und das ist die bei weitem beste Lösung) mit einer echten Datenbank oder mit Klassen, die sich aus einem Stream laden und darin speichern können. Dafür kannst du jeweils LoadFromStream und SaveToStream in einer Datenklasse (oder auch einem Datenrecord) implementieren und brauchst dann nur noch per Schleife alle Daten durchgehen.
Eine Lösung wie du sie hast, wäre theoretisch denkbar, würde ich aber nicht empfehlen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TDatenrecord = record Name: array[0..512] of Char; Jahr: Integer; end;
var AlleDaten: array[1..MaxDaten] of TDatenrecord; |
(Ich habe auch mal die Schreibweise auf Delphi angepasst, deine ist ja eher Turbo Pascal. ;-))
Gagamba - Di 28.08.12 11:05
Hallo,
apropos 'Turbo Pascal': ich bin halt noch von der 'alten Schule' wodurch es halt auch passiert, dass alte (Daten-)Strukturen immer wieder mitgeschleppt werden.
Die Lösung mit dem Array (statt des Stringtyps) war mir zwar bekannt, aber mir ist nicht 100% klar, ob das absolut kompatibel ist zu Unicode ist?!
Oder sollte ich definitiv Strings und numerische Daten trennen, dann die Strings per TStringlist.<Methode> lesen und schreiben?! Ich bin halt am rumsuchen, was das praktikabelste wäre..
Gruß: Siegfried
jaenicke - Di 28.08.12 11:19
Gagamba hat folgendes geschrieben : |
| Die Lösung mit dem Array (statt des Stringtyps) war mir zwar bekannt, aber mir ist nicht 100% klar, ob das absolut kompatibel ist zu Unicode ist?! |
Ja, ist es.
Gagamba hat folgendes geschrieben : |
| Oder sollte ich definitiv Strings und numerische Daten trennen, dann die Strings per TStringlist.<Methode> lesen und schreiben?! Ich bin halt am rumsuchen, was das praktikabelste wäre.. |
Die beste, einfachste und auch zur Laufzeit schnellste Lösung wäre eine echte Datenbank, insbesondere bei einer größeren Anzahl an Datensätzen und Suchen darin usw.
Ansonsten bietet sich das direkte Lesen und Schreiben über Streams wie schon geschrieben an.
Gagamba - Di 28.08.12 11:30
Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!