Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Der in Operator (https://www.delphipraxis.net/178923-der-operator.html)

Sherlock 4. Feb 2014 09:11

Delphi-Version: XE2

Der in Operator
 
Hi zusammen,
ich wollte gerade ein
Delphi-Quellcode:
in
verwenden, um ein längliches
Delphi-Quellcode:
if
zu verkürzen.
Aus:
Delphi-Quellcode:
 if (messwert.WerteDefID = wdPH.No) or (messwert.WerteDefID = wdBE.No) then
sollte ein hübsches:
Delphi-Quellcode:
if messwert.WerteDefID in [wdPH.No, wdBE.No] then
werden.
Verglichen werden hier allesamt Integer. Es kompiliert auch brav. Nur zur Laufzeit ist das immer false, obwohl ich im Debugger sehe, daß eine Übereinstimmung vorliegt.
Aus diesem SO-Beitrag http://stackoverflow.com/questions/9...operator-usage lese ich heraus, daß das irgendwie nur mit "kleinen" (Byte-) Werten gehen soll, ich habe aber eine Übereinstimmung mit einem Wert von 1743...liegt es daran? Oder mache ich etwas grundsätzlich falsch.

Sherlock

Uwe Raabe 4. Feb 2014 09:18

AW: Der in Operator
 
Der in-Operator agiert nur mit Sets und Sets sind auf 0..255 beschränkt.

Der Compiler führt beim Aufbau der Sets einen impliziten Cast auf Byte aus. Hast du die Überlaufprüfung aktiv? Die sollte da eigentlich zur Laufzeit anspringen.

Sherlock 4. Feb 2014 09:22

AW: Der in Operator
 
Haha, Danke, genau die Überlaufprüfung ist aus ;)

Schade aber, weil eigentlich könnte man damit reichlich Eleganz und Übersichtlichkeit produzieren. Vielleicht gibt es aber sogar eine Warnung dazu?

Sherlock

TiGü 4. Feb 2014 09:40

AW: Der in Operator
 
Was spricht gegen diese elegante Möglichkeit?
Delphi-Quellcode:
  case messwert.WerteDefID of
    wdPH.No,
    wdBE.No :
    begin

    end;
  end;

himitsu 4. Feb 2014 10:13

AW: Der in Operator
 
Im Grunde brauchst du eine Funktion ala Delphi-Referenz durchsuchenMatchStr (Welche es aber nicht im Delphi gibt ... k.A. warum),
aber eventuell reicht auch Delphi-Referenz durchsuchenInRange.

Delphi-Quellcode:
function MatchInt(AInt: Integer; const AValues: array of Integer): Boolean;

if MatchInt(messwert.WerteDefID, [wdPH.No, wdBE.No]) then
Aber den CASE-Trick verwende ich da auch öfters.


Bei Werten zwischen 0 und 65535 könnte man eventuell auch die Unicode-Funktionen misbrauchen aber in der Unit Character finde ich leider keine passende Funktion.



0..255 => Rate mal, warum IN nicht mehr beim Char (TSysCharSet) geht und Delphi seit 2009 eine Warnung wirft. :zwinker:

Sherlock 4. Feb 2014 10:53

AW: Der in Operator
 
Ja, das case verwende ich jetzt auch. :)
Auf andere "üble" Tricks will ich lieber im Sinne der Lesbarkeit verzichten ;)

Sherlock

TiGü 4. Feb 2014 12:11

AW: Der in Operator
 
Seit wann nochmal ist
Delphi-Quellcode:
case of
das neue
Delphi-Quellcode:
with
?:gruebel:

Sherlock 4. Feb 2014 12:22

AW: Der in Operator
 
Neee, das kannste jetzt aber echt nicht vergleichen!

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz