Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: Multible Typ-Konvertierung (eleganter, als mein Weg?)

  Alt 26. Apr 2009, 23:00
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat