Если вызов savetofile находится в конце программы, и программа аварийно завершается, то этот вызов, вероятно, не будет выполнен. Я использую механизм ведения журнала, который при каждом вызове журнала открывает файл журнала, записывает текст журнала и время, сбрасывает, а затем закрывает файл журнала. Таким образом, текст журнала гарантированно будет записан в файл, даже если программа аварийно завершится.
Вот код:
procedure TMainForm.Log (const s: string);
var
f: textfile;
begin
assignfile (f, logfilename);
{$I-} // yes, I know: modern programming style requires a try/except block
append (f);
if ioresult <> 0 then rewrite (f);
{$I+}
writeln (f, datetostr (now), ' ', timetostr (now), ' ', s);
flush (f);
closefile (f);
end;