Ich würde versuchen in der Komponente den Fehler beheben zu lassen (oder selbst beheben).
Kommt die Funktion aus einer
DLL?
Was sagt denn
ShowMessage(StringElementSize(Value).ToString + ' ' + StringCodePage(Value).ToString);
?
1 1252 = eine
ANSI-Codepage, z.B. für Deutsch
2 1200 = Codepage für UTF-16BE
Ist das ein alter Quellcode (vor D2009) und "blos" die Signatur des Events ist falsch? (String statt AnsiString)
Aber eigentlich sollte der FormDesigner diesen Fehler bemerken, wenn man die
Unit speichert.
Du kannst mit
TEncoding.ANSI.GetString die enthaltenen Bytes in einen String kopieren,
oder via
SetString.
Delphi-Quellcode:
var
A: AnsiString;
S: string;
begin
A := '123';
Pointer(S) := Pointer(A); // nicht nachmachen ... ich weiß was ich tu :D
ShowMessage(StringElementSize(S).ToString + ' ' + StringCodePage(S).ToString);
SetString(S, PAnsiChar(@S[1]), {Length(S) * 2}4);
S := TrimRight(S); //if (S <> '') and (S[High(S)] = #0) then Delete(S, High(S), 1);
end;
Trim, denn was passiert, wenn es eine ungerade Zeichenanzahl ist?
Nicht wundern, der Debugger zeigt es hier "richtig" an, denn er beachtet die StringCodePage, und auch Length ließt hier die "richtige" Länge aus.
Und ja, High statt Length, denn bei Strings zählt es bei 1 los, also ist das Selbe,
außer bei
{$ZEROBASEDSTRINGS ON}
, z.B. im Android, wo es bei 0 beginnt zu zählen.