Hallo @all,
ich liebe Delphi, doch es nervt mich schon seit Ewigkeiten, dass es keine Möglichkeit gibt eine Variable zu setzen und gleichzeitig zu einem Bool auszuwerten. Um besser zu verstehen, was ich meine hier ein Code-Fetzen, der z.B. in PHP/JavaScript funktioniert:
Code:
function Foo($Value)
{
if ($LocalValue = $Value * 10) && ($LocalValue > 100)
return $LocalValue - 1;
else
return $LocalValue + 1;
}
Man beachte, dass $LocalValue in jedem Fall gesetzt wird, aber die nächste Bedingung nur ausgewertet wird, wenn es zu Boolean(True) gewandelt werden kann, was bei numerischen Typen alles <> 0 ist.
Das ist nur ein stupides Beispiel, aber wenn ich es zu Delphi übersetze:
Delphi-Quellcode:
function Foo(Value:Integer):Integer;
begin
Result:=Value * 10; // Das ist das was mich nervt: zusätzliche Zeile
if Result > 100 then
Result:=Result - 1
else
Result:=Result + 1;
end;
Naja dachte ich mir, dann ist es doch kein Problem eine überladene Funktion zuschreiben, wie z.B.:
Delphi-Quellcode:
function SetCheck(var Target:Integer; const Value:Integer):Boolean; overload; inline;
function SetCheck(var Target:Int64; const Value:Int64):Boolean; overload; inline;
function SetCheck(var Target:String; const Value:String):Boolean; overload; inline;
...
function SetCheck(var Target:Integer; const Value:Integer):Boolean;
begin
Target:=Value;
Result:=Value <> 0;
end;
...
Hat auch wunderbar funktioniert (für einfache Typen), bis ich zum TObject bzw. IInterface kam:
Delphi-Quellcode:
function SetCheck(var Target:TObject; const Value:TObject):Boolean;
begin
Target:=Value;
Result:=Assigned(Value);
end;
Sieht logisch aus, aber leider lässt es sich nur mit TObject und sonst mit keinem anderen Nachkommen verwenden, da Delphi ja die Einschränkung hat, dass var-Parameter dem deklarierten Typ exakt entsprechen müssen.
Habt ihr hierfür eine Lösung? Vielleicht über Assembler?
Die Anforderung ist ja ganz simpel: Die Funktion soll in jedem Fall einen Wert an eine Variable zuweisen und diesen als Boolean auswerten.