Ich habe den Fehler von obiger Position aus weiter verfolgt und komme nun auch in die im 1.Post erwähnte Zeile
Code: Alles auswählen
Result := rect(floor(fx - frx), floor(fy - fry), ceil(fx + frx), ceil(fy + fry));
fx und fy haben im Fehlerfall den Wert -3.4E38, frx und fry sind in Gegend von 1. Summe und Differenz der beiden überschreiten bei weitem den Integer-Wertebereich. Die Anwendung als Argument in den Floor und Ceil-Funktionen, die ja Integer-Werte zurückgeben sollen, führt in Windows zu der "INVALID OPERATION". Warum das unter Linux gutgeht, weiß ich nicht.
Eine Möglichkeit zur Fehlerbehebung wäre, lokale Varianten der floor() und ceil()-Funktionen zu schreiben, die sicherstellen, dass der Integer-Bereich nicht überschritten wird:
Code: Alles auswählen
function floor(x: single): Integer;
begin
if x < -MaxInt-1 then
Result := -MaxInt-1
else if x > MaxInt then
Result := MaxInt
else
Result := math.Floor(x);
end;
function ceil(x: single): Integer;
begin
if x < -MaxInt-1 then
Result := -MaxInt-1
else if x > MaxInt then
Result := MaxInt
else
Result := math.Ceil(x);
end;
function TFillEllipseInfo.GetBounds: TRect;
begin
Result := rect(floor(fx - frx), floor(fy - fry), ceil(fx + frx), ceil(fy + fry));
end;