Der Fehler ist der Datentyp für Round().
X := Round(10);
ergibt auch ein EInvalidOP.
X := Round(10.0);
ergibt
kein EInvalidOP.
Wie bei Image1.Height wird die 10 zu einem Integer, Round erwartet aber einen Real-Typen (Double, Extended etc.).
Bei
X := Round((5.4097598831e+17 / (2 * 13.685690504)) * 497);
.
wurde 497 zu einem Extended, da hier an die anderen Konstanten angepasst wird (werden darf), die vom Compiler durch den Dezimalseparator bereits als Extended erkannt wurden.
***
Der Compiler wertet zuerst den Ausdruck aus und nimmt den einfachsten passenden Datentyp (Integer vor Real), danach kommt der Funktionsaufruf Round(). Das ist der Grund, warum der Compiler quasi dem Code ein Bein stellt.
Warum der Ausdruck
(5.4097598831e+17 / (2 * 13.685690504)) * Image1.Height
.
zu einem
nicht umcastbaren Integer wird und
Round(Image1.Height)
.
vom Compiler zu einem Real gecastet wird, wäre dann
meine nächste Frage