![]() |
Delphi-Version: 5
Eleganter Weg Shortstrings mit Unicode zu haben?
Nach einigen Versuchen Delphi 2007 Code nach XE4 zu migrieren hier einmal eine Stilfrage.
Vielfach habe ich Records die einen ShortString enthalten um entsprechend Speicher im Record zu reservieren:
Code:
In DXE4 möchte ich eigentlich das selbe haben nur eben als Unicode-ShortString. Was also daraus wird ist:
Type
MyRecord = Record Value: Integer; Name: String[32]; ... End;
Code:
...nur elegant ist das leider nicht mehr den folgender Code compiliert nicht mehr:
Type
MyRecord = Record Value: Integer; Name: Array[0..32] of Char; ... End;
Code:
Möglich wäre natürlich:
Var
s: String; m: MyRecord Begin s := 'Test'; m.Name := s; <--- E2010 Inkompatible Typen: 'array[0..32] of Char' und 'string'
Code:
aber elegant ist das nicht, denn das bedeutet riesige Mengen Sourcecode zu ändern und aus einer schönen Zuweisung einen äußerst hässlichen Funktionsaufruf zu machen....
StrCopy(AData.szModel, PChar(fData.LastDevice.Model));
StrLCopy(AData.szModel, PChar(fData.LastDevice.Model), 32); Bleibt die Frage ob es dafür eine elegant Lösung gibt die ohne Änderung am restlichen Code funktioniert (und "Name: String;" kann es nicht sein...)? |
AW: Eleganter Weg Shortstrings mit Unicode zu haben?
Mit einer reinen Zuweisung geht das eigentlich nicht, einen Trick gibt es aber. Ich denke mal das ganze sauber umzubauen (sprich von den Turbo Pascal Strukturen mit Records direkt in Dateien usw. wegkommen), wird im Moment nicht möglich sein, deshalb wird das wohl die sinnvollste Variante sein...
Das sieht dann so aus:
Delphi-Quellcode:
type
TFixedCharArray32 = record Value: array[0..31] of Char; // 31 !! class operator implicit(const AValue: string): TFixedCharArray32; class operator implicit(const AValue: TFixedCharArray32): string; end; TMyRecord = record Value: Integer; Name: TFixedCharArray32; end; class operator TFixedCharArray32.implicit(const AValue: string): TFixedCharArray32; begin StrLCopy(Result.Value, PChar(AValue), 32); end; class operator TFixedCharArray32.implicit(const AValue: TFixedCharArray32): string; begin Result := AValue.Value; end; var s: String; m: TMyRecord; begin s := 'Test'; m.Name := s; ShowMessage(m.Name); ShowMessage('Größe: ' + IntToStr(SizeOf(m)) + ' (4 Byte Integer + 2 Byte * 32 Zeichen)'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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