Einzelnen Beitrag anzeigen

WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
135 Beiträge
 
Delphi 10.4 Sydney
 
#1

Funktion, die beliebigen Typ zuweist und als Bool auswertet

  Alt 2. Mär 2011, 09:21
Delphi-Version: XE
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.
Waldemar Derr
  Mit Zitat antworten Zitat