Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Umstellung D7 auf XE (https://www.delphipraxis.net/177209-umstellung-d7-auf-xe.html)

hanspeter 24. Okt 2013 14:45

Delphi-Version: 5

Umstellung D7 auf XE
 
Hallo,

ich beginne ein Legacy-Projekt auf XE umzustellen.

Hier wird sehr häufig nachfolgendert Konstruct verwendet. (Beispiel)
Delphi-Quellcode:
type
Dat = record
  PLZ: String[8];
  Ort: String[40];
end;
Das wird dann so verwendet:

Delphi-Quellcode:
r.Plz := '1234';
r.Ort := 'Hier';

Mem := TMemorystream.Create;
Mem.Write( r,sizeof(r));
u.s.w.

Mit String bekomme ich da ja Probleme.
Wie könnte man so einen Construct am
zweckmäßigsten umstellen ohne sich Unicode zu verbauen. ?

Für einen Tip dankbar.

Mit Gruß Peter

himitsu 24. Okt 2013 14:51

AW: Umstellung D7 auf XE
 
Delphi-Quellcode:
type
Dat = record
  PLZ: array[1..8] of WideChar;
  Ort: array[1..40] of WideChar;
end;
Falls es probleme Beim Zuweisen/Auslesen gibt, dann
- kann man die Arrays nochmal in einen Record packen und mit Operatoren versehen
- dem Dat-record Property zuweisen, welche über Getter/Setter auf das Feld zugreifen

Und den Zugriff im Programmcode kann man notfals über Private/Public steuern.



Oder du verwendest statt dem TMemoryStream lieber sowas wie TStringStream, TReader/TWriter, oder Dergleichen.

Uwe Raabe 24. Okt 2013 14:58

AW: Umstellung D7 auf XE
 
Solange die Inhalte des MemoryStream nur innerhalb deines eigenen Programms verwendet werden und nicht kompatibel zu anderen Programmen bleiben müssen, kannst du das Speicherformat ja beliebig ändern. Zum einen kannst du dann die Begrenzung der String-Längen aufheben und auch Unicode implementieren. Dazu müsstest du aber die Record-Strukturen vom Speicherformat entkoppeln.

Als erstes würde ich die Records mit Methoden zum streamen erweitern (LoadFromStream, SaveToStream), die zunächst lediglich die direkten Read- und Write-Zugriffe kapseln. Wenn dann nirgendwo mehr das Speicherlayout der Records vorausgesetzt ist, kannst du die Records schrittweise umbauen und die Stream-Methoden entsprechend anpassen.

Wie gesagt, das geht dann nicht (so einfach), wenn der Stream-Inhalt außerhalb verwendet wird - und sei es, daß du mit dem alten Format gespeicherte Dateien einliest.

romankassebaum 24. Okt 2013 20:35

AW: Umstellung D7 auf XE
 
Hallo,

ich möchte darauf hinweisen, dass der ShortString aus Deinem Record ein AnsiString ist. Das bedeutet, dass Du unter Unicode nicht zwingend Probleme bekommst.
Es hängt davon ab, ob Du die Daten mit anderen Anwendungen austauscht und selbstverständlich welche Zeichen Du rein schreibst.

Prinzipiell wäre es natürlich besser, den Record mit Methoden wie LoadFromStream und SaveToStream zu versehen. Möglicherweise kann es auch günstig sein, ein Objekt oder gar ein Interface stattdessen zu verwenden. Das hängt von Deiner Anwendung ab.

Ach ja, falls Du irgendwann mit dem NEXTGEN Compiler arbeiten möchtest, dann solltest Du Dich rechtzeitig von den ShortStrings verabschieden.

--
Viele Grüße,

Roman Kassebaum
Embarcadero Technology Partner
Embarcadero MVP
Blog: http://blog.kassebaum.eu

hanspeter 28. Okt 2013 11:27

AW: Umstellung D7 auf XE
 
Vielen Dank für die Tips.
Ich denke, dass ich die Records wohl auf Klassen umstellen werde.
Statt der Ablage in einem Memorystream läßt sich, warscheinlich auch schneller,
dass über eine Objketliste oder ein Directionary realisieren.

Mit Gruß
Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz