![]() |
AW: Sonderzeichen in TEdits (Charset?)
Zitat:
Zitat:
Also auf einem russischen System wird nur der rusische Teil in ANSI gespeichert. Ließt man nun diesen AnsiString in einem anderem System aus, so wird da ebenfalls die SystemCodePage verwendet und es wird falsch ausgelesen. Also lieber WideString nutzen, oder
Delphi-Quellcode:
TMyStoredRecord = record
EinString: array[1..50] of WideChar; end; |
AW: Sonderzeichen in TEdits (Charset?)
Zitat:
Zitat:
|
AW: Sonderzeichen in TEdits (Charset?)
Da D2007 Recordoperatoren bietet, könnte man für das WideChar-Array einen Ersatz stellen, welcher 100%ig wie ein WideString nutzbar ist und zugleich die Vorteile des ShortString/CharArray bietet.
![]() Gut, bei gespeicherten Records müßte man die Dateien/Recorddaten erstmal konvertieren. |
AW: Sonderzeichen in TEdits (Charset?)
Zitat:
Delphi-Quellcode:
genommen, aber das geht schon mal gar nicht. Als Notbehelf dachte ich an
FixedSizeUnicodeString<N: Integer>
Delphi-Quellcode:
, den ich z.B. als
FixedSizeUnicodeString<BaseT>
Delphi-Quellcode:
o.ä. instantiiert hätte, aber auch da ging nix. Habt ihr da schon mal eine funktionierende Lösung gesehen?
var s50: FixedSizeUnicodeString<string[50]>
|
AW: Sonderzeichen in TEdits (Charset?)
Nee, leider gibt es keine Möglichkeit, um bei den Generics Nummern zu übergeben.
Und wenn man den Speicher als
Delphi-Quellcode:
oder
String[x]
Delphi-Quellcode:
als Parameter übergibt, dann kann man nicht innerhalb des generischen Typs darauf zugreifen, um die nötigen Konvertierungen für die Operatoren zu implementieren.
array[0..x] of Char
Praktisch sind die Generics dafür komplett nutzlos. :evil: Von der Sprache/Syntax her wäre es schon möglich den Generigs etwas von Makros mitzugeben oder eben, daß man nicht nur Typen, sondern auch Werte (Nummern oder Strings) als "Parameter" an den Generic übergibt ... aber ob Emba jemals sowas Cooles in die Generics einbaut? (wäre immerhin ein Pluspunkt gegenüber den anderen Programmiersprachen, welche Generics kennen) Der Einzige Ausweg blieb halt nur noch ein "blödes" Template, über welches man sich zumindestens passende Typen basteln könnte. Da die Generics nur einmal geparst und sofort auf Syntax und Typverträglichkeit geprüft werden, wo der ersetzende Typ noch nichtmal bekannt ist, kann man da innerhalb der Generics leider nicht viel machen. :cry: Ein mehrschichtiger Parser würde mir in Delphi wirklich gefallen, welcher die Typkompatibilität erst nach dem Ersetzen der generischen Typen prüft. |
AW: Sonderzeichen in TEdits (Charset?)
Zitat:
Delphi-Quellcode:
, was sich zumindest compilieren ließ. :mrgreen: Aber leider war cBaseSize immer 0, egal, welchen Typ man übergeben hat. Experimente mit constraints (z.B.
FixedSizeUnicodeString<BaseT> = record
public const cBaseSize = SizeOf(BaseT); strict private FBuffer: array[0..Pred(cBaseSize)] of WideChar; end;
Delphi-Quellcode:
) haben das - WIMRE - behoben, sich aber nie für BaseT = string[N] compilieren lassen.
FixedSizeUnicodeString<BaseT: record>
Zitat:
Zitat:
![]() |
AW: Sonderzeichen in TEdits (Charset?)
Zitat:
Das Problem ist halt, daß BaseT zur Compilezeit und an dieser Stelle noch nicht bekannt ist. Leider arbeitet der Compiler nur in einem Durchgang, so daß der Code nicht nochmal übersetzt wird ... SizeOf bekommt also niemals den Ersatztypen mit, welchen man bei einer späteren Verwendung des GenTyps angibt. Leider fehlt mir auch die Zeit, um mich mal mit einem Precompiler für Delphi zu beschäftigen und zu schauen, ob sich da etwas machen ließe. :? (hatte zwar mal einen PreCompiler für D2005 oder 2006 gefunden, aber wenn ich jetzt suche, dann finde ich nur noch Welche für die alten Compiler ala D7 und das funktioniert unter neueren Delphis nicht mehr und ist meistens auch "unschön" gelöst) |
AW: Sonderzeichen in TEdits (Charset?)
Zitat:
Delphi-Quellcode:
Dann hatten Instantiierungen von FixedSizeUnicodeString zumindest die richtige SizeOf. Dafür hat's dann wieder woanders gehakelt, mal abgesehen davon, dass das eine Move/FillChar/Cast/Pointerarithmetik-Orgie geworden wäre.
FixedSizeUnicodeString<BaseT> = record
strict private FBufferPart1: T; FBufferPart2: T; end; Aus irgendeinem Grund verrät der Compiler uns aber die Größe nicht, auch wenn er sie kennt.:evil: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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 by Thomas Breitkreuz