all zu kompliziert isses jetzt garnicht ... schau die mal den Typ Variant an ... der hat intern auch sowas .... nur noch viel viel viel größer/aufwendiger.
PS: bei aPtr und Co. ich würde die Dereferenzierung andersrum machen ... wenn du statt dem untypisieren
Pointer mal einen typisierten Zeiger hast, dann knallt es da womöglich oder der Compiler sagt gleich nö.
z.B. statt Boolean(TargetPtr^) dann PBoolean(TargetPtr)^
Delphi-Quellcode:
function Pointer2String(aPtr : Pointer; AsTyp : TstDataTyp; Size : Integer): AnsiString;
st_Currency : Result := CurrToStr(PCurrency(aPtr)^);
// StrToCurr hast später ja schon genutzt, warum dann hier Format-%m ?
// CurrToStr paßt dich zum IntToStr/FloatToStr besser dazu ^^
function Pointer2Boolean(aPtr : Pointer; AsTyp : TstDataTyp; Size : Integer): Boolean;
st_Byte : Result := PByte(aPtr)^ <> 0;
...
st_Currency : Result := PCurrency(aPtr)^ <> 0;
st_Chars : if not TryStrToBool(PChar(aPtr), Result) then Result := False;
st_ShortStr : if not TryStrToBool(PShortString(aPtr)^, Result) then Result := False;
else
function Pointer2Integer(aPtr : Pointer; AsTyp : TstDataTyp; Size : Integer): Int64;
st_Chars : if not TryStrToInt64(PChar(aPtr), Result) then Result := 0;
st_ShortStr : if not TryStrToInt64(PShortString(aPtr)^, Result) then Result := 0;
else
function Pointer2Float(aPtr : Pointer; AsTyp : TstDataTyp; Size : Integer): Double;
begin
case AsTyp of
st_Boolean : if Boolean(aPtr^) then Result := 1 else Result := 0;
st_Chars : if not TryStrToFloat(PChar(aPtr), Result) then Result := 0;
st_ShortStr : if not TryStrToFloat(PShortString(aPtr)^, Result) then Result := 0;
else
function CleanCurrStr(Str : String): String;
begin
Result := Str;
for i := Length(Str) downto 1 do
if not (Str[i] in ['+-0123456789']) and (Str[i] <> DecimalSeparator) then
Delete(Result, i, 1);
end;
und dann halt noch bei Pointer2Currency und Pointer2DateTime die Sache mit den Exceptions ... siehe oben die Try-Funktionen
[add]
statt Try-Except gibt es oftmal gleich hübsche Funktionen ala TryStrToInt oder (mißt, fällt mir grad ein) StrToIntDef
(Def=Default)
und was passiert, wenn mal eine andere
Exception auftritt, als die, welche du abfängst? genau, Result wäre undefiniert
Delphi-Quellcode:
function Pointer2Boolean(aPtr : Pointer; AsTyp : TstDataTyp; Size : Integer): Boolean;
st_Byte : Result := PByte(aPtr)^ <> 0;
...
st_Currency : Result := PCurrency(aPtr)^ <> 0;
st_Chars : Result := StrToBoolDef(PChar(aPtr), Result, False);
st_ShortStr : Result := StrToBoolDef(PShortString(aPtr)^, Result, False);
else