![]() |
Unicode-String im Record speichern
Hallo,
ich stelle grade von Delphi7 auf Delphi9. Dabei gibt es jetzt (wie erwartet) Probleme mit Unicode bzw. Widestring. einfaches Codebeispiel:
Delphi-Quellcode:
Das Sichern/Laden geht standardmäßig über eine Datei
TYPE Datenrecord = RECORD
Name : STRING; Jahr : INTEGER; END; VAR AlleDaten : ARRAY [1..MaxDaten] OF Datenrecord;
Delphi-Quellcode:
die konventionell-sequentiell gelesen bzw. geschrieben wird
VAR Datenfile : FILE OF Datenrecord
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? Besten Dank schonmal vorab: Gagamba |
AW: Unicode-String im Record speichern
Zitat:
Delphi-Quellcode:
Name: array[1..300] of WideChar;
|
AW: Unicode-String im Record speichern
Nur der Typ
Delphi-Quellcode:
ist ein ShortString mit Längenangabe und kein AnsiString.
String[nr]
|
AW: Unicode-String im Record speichern
OK, ich hab mich falsch ausgedrückt: ich habe unter Delphi7 und früheren Versionen immer nur Shortstrings verwendet, auch innerhalb von gemischten Datenrecords. So kommt das Problem jetzt zu Stande. Ich möchte ja nicht einen Zeiger auf einen String abspeichern, sondern den Inhalt. Wenn ich nur den Zeiger abspeichere, dann geht der Inhalt ja für die nächste Sitzung verloren...
Danke soweit |
AW: Unicode-String im Record speichern
Wenn du keine Unicode-Strings hast ist doch die Lösung von himitsu das was du benötigst
|
AW: Unicode-String im Record speichern
Das ist aber kein Problem von Unicode, sondern Bestand bei AnsiString ja auch schon. mach es wie Detlef es vorgeschlagen hat.
|
AW: Unicode-String im Record speichern
Zitat:
|
AW: Unicode-String im Record speichern
@himitsu und DeddyH
da gab es einen Compilerschalter der String=Ansistring oder String=Shortstring auswählen konnte. Zitat:
Dann Nutz doch ein
Delphi-Quellcode:
Gruß
Tunicodestring = record
lange : word; ustr : array[1..255] of widechar; end; K-H |
AW: Unicode-String im Record speichern
Richtigstellung:
ich hatte BISHER keinen Unicode-String, muss JETZT aber umstellen. Brauche also im Datenrecord einen speicherbaren Stringtyp, der Unicode-kompatibel ist. Sollte das NICHT möglich sein (z.B. via Array .. of Char, da hab ich nicht den Durchblick, ob das wirklich 100% kompatibel ist zum Unicode-String) muss ich vermutlich(?!) numerische Daten von Textdaten trennen und die Textdaten via TStringlist und dessen Methoden lesen und schreiben. Oder hat jemand eine andere und/oder bessere Idee? Danke! |
AW: Unicode-String im Record speichern
Zitat:
|
AW: Unicode-String im Record speichern
Wenn man jedem Record eine LoadFrom/SaveTo-Stream Methode spendiert, hat man all diese Probleme doch nicht.
In dieser Methode lädt/speichert man einfach explizit jedes Feld einzeln. |
AW: Unicode-String im Record speichern
Dann kannst'e aber auch gleich eine Klasse nutzen, wobei der Schreiben lesen auch sehr schön über die RTTI behandelt werden kann.
Für UnicodeStrings, bzw für längere AnsiStrings (> 255) in Records hatte ich mal fast für ab D2006/TDE veröffentlicht. Also ein Records mit Array[..] of XxxChar, welcher mit Operatoren so aufgemotzt wurde, damit er sich wie ein normaler String nutzen läßt. |
AW: Unicode-String im Record speichern
Zitat:
|
AW: Unicode-String im Record speichern
Zitat:
|
AW: Unicode-String im Record speichern
Hallo,
xml kommt eigentlich nicht in Frage, damit werden manche Dateien riesig und unhandlich. Siegfried |
AW: Unicode-String im Record speichern
Zitat:
|
AW: Unicode-String im Record speichern
Zudem düftre es nicht viel mehr ergeben, wie eine reine Textdatei; dabei aber besser lesbar sein.
|
AW: Unicode-String im Record speichern
aha, und was ist JSON?
ich gebe zu bedenken, dass manche Dateien tausende von numerischen variablen (die Texte sind ja nur eine Ausnahme) enthalten, somit auch tausende von zeilen innerhalb der xml-datei zu verwalten wären - ganzh zu schweigen von der womöglich schwachen Genauigkeit, wenn man real-zahlen alphanumerisch speichert.. Gagamba |
AW: Unicode-String im Record speichern
Zitat:
Müste mal sehn, wie schnell ich daheim eine Unit wiederfinde, wo ich das verwendete, um hier über den Typenbezeichner suchen zu können. |
AW: Unicode-String im Record speichern
![]() |
AW: Unicode-String im Record speichern
Du kannst auch binär speichern, wenn es auf die Größe ankommt. Wenn Du beide Seiten selbst implementierst, dann würde ich das Binärformat bevorzugen, da jedes Record/Klasse mit ihren LoadFrom/SaveToStream-Methoden und geeigneter Testungebung ausreichend robust ist.
Eine Delphi-Implementierung findest Du z.B. ![]() |
AW: Unicode-String im Record speichern
Zitat:
Delphi-Quellcode:
). Blöde Idee. :mrgreen:
MyString50: TFixedUnicodeString<string[50]>;
|
AW: Unicode-String im Record speichern
Ich hatte es auch versucht mit den Generics zu kreuzen, aber leider kann man die nicht wie Makros verwenden, bzw. man kann keine generischen Konstanten mitgeben.
Quasi
Delphi-Quellcode:
, wo dann intern ein
TMyString<50>
Delphi-Quellcode:
dekalriert wird. :cry:
array[0..50-1] of char
Im Prinzip bestand es halt aus soeinem Array, in einem Record verpackt und dazu noch ein paar implizite und explizite Operatoren von und zu AnsiString, WideStringund zuletzt auch noch UnicodeString, welche das Array entsprechend mit einem #0-terminierten String füllten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 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