AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Eleganter Weg Shortstrings mit Unicode zu haben?
Thema durchsuchen
Ansicht
Themen-Optionen

Eleganter Weg Shortstrings mit Unicode zu haben?

Ein Thema von Whookie · begonnen am 8. Okt 2013 · letzter Beitrag vom 8. Okt 2013
Antwort Antwort
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#1

Eleganter Weg Shortstrings mit Unicode zu haben?

  Alt 8. Okt 2013, 21:39
Delphi-Version: 5
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...)?
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Eleganter Weg Shortstrings mit Unicode zu haben?

  Alt 8. Okt 2013, 21:56
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;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 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