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;