Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Eleganter Weg Shortstrings mit Unicode zu haben? (https://www.delphipraxis.net/176983-eleganter-weg-shortstrings-mit-unicode-zu-haben.html)

Whookie 8. Okt 2013 20:39

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:
Type
  MyRecord = Record
    Value: Integer;
    Name: String[32];
    ...
  End;
In DXE4 möchte ich eigentlich das selbe haben nur eben als Unicode-ShortString. Was also daraus wird ist:

Code:
Type
  MyRecord = Record
    Value: Integer;
    Name: Array[0..32] of Char;
    ...
  End;
...nur elegant ist das leider nicht mehr den folgender Code compiliert nicht mehr:

Code:
  Var
    s: String;
    m: MyRecord
  Begin
    s := 'Test';
    m.Name := s; <--- E2010 Inkompatible Typen: 'array[0..32] of Char' und 'string'
Möglich wäre natürlich:

Code:
  StrCopy(AData.szModel, PChar(fData.LastDevice.Model));
  StrLCopy(AData.szModel, PChar(fData.LastDevice.Model), 32);
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....

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...)?

jaenicke 8. Okt 2013 20:56

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 01:42 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