Autor Beitrag
Gagamba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 28.08.12 09:05 
Hallo,
ich stelle grade von Delphi7 auf Delphi9. Dabei gibt es jetzt (wie erwartet) Probleme mit Unicode bzw. Widestring.
einfaches Codebeispiel:

ausblenden 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
ausblenden 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 user profile iconMartok: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19328
Erhaltene Danke: 1750

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TDatenrecord = record
    Name: array[0..512of 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19328
Erhaltene Danke: 1750

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 28.08.12 11:19 
user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 28.08.12 11:30 
Danke!