Das {Q+} darfst Du erst hinter der wirklichen Auswertung setzen.
Probier es mal ungefähr so :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
erg,
h: longint;
k: string;
function sub: longint;
var
i: byte;
begin
h := 0;
{$Q-,R-}
for i := 1 to Length(k) do
h := h*129 + ord(k[i]) + $9e370001; {---- hier knallt es!}
// Hier bringt {Q+} nichts.
Result := h;
end;
begin
k:= 'bla';
erg:=sub; showmessage(inttostr(erg));
{$Q+,R-} // Hier wurde die Auswertung vorgenommen, also kann die Prüfung wieder aktiviert werden.
end;
Weil die Variablentypen und ihre Werte aus Deinem Beispiel nicht so ganz ersichtlich sind, habe ich einfach irgendwas genommen, das dennoch den Fehler reproduziert bzw. abfängt. Es ist sinnvoll, außer der Überlaufprüfung auch die Bereichsüberprüfung abzustellen. Sowas sollte aber immer nur bis zum Herausfinden der Fehlerursache geschehen. Oft helfen Klammerungen und Typenumwandlungen.