Ich war auch durch diesen Hinweis verwirrt. Dann wurde mir klar, was das Problem ist. Ihr Code:
uses
SysUtils;
procedure TForm1.DoStuff;
begin
SysUtils.DeleteFile('foo');
end;
wahrsten Sinne des Wortes wird mit Fassung:
uses
SysUtils;
procedure TForm1.DoStuff;
var
Flags, LastError: Cardinal;
begin
Result := Winapi.Windows.DeleteFile(PChar(FileName));
if not Result then
begin
LastError := GetLastError;
Flags := GetFileAttributes(PChar(FileName));
if (Flags <> INVALID_FILE_ATTRIBUTES) and (faSymLink and Flags <> 0) and
(faDirectory and Flags <> 0) then
begin
Result := RemoveDirectory(PChar(FileName));
Exit;
end;
SetLastError(LastError);
end;
end;
Wenn Sie bemerken, Ihre "neuen" Code ist abhängig von WinApi.Windows
Einheit:
Result := Winapi.Windows.DeleteFile(PChar(FileName));
die Sie nicht in Ihrer uses
Klausel enthalten.
Wenn Sie den Code manuell eingefügt (kopiert und eingefügt) haben, wird der Code nicht kompiliert, bis Sie Windows
zu Ihrem uses
hinzugefügt haben.
Stattdessen wird der Compiler nicht die inline
weil:
Inline-Funktion 'DeleteFile' erweitert wurde nicht, weil Unit 'Windows' angegeben ist nicht in uses-Liste "
" ist wörtlich ersetzt werden mit "- nicht GENAU, wie Sie es gezeigt haben, weil der Inlining-Prozess Anpassungen vornehmen muss, um die Parameter und Ergebniswerte für einen Funktionsaufruf, der nicht mehr ein Funktionsaufruf nach Inlining ist, angewendet wird. Aber die Jist Ihrer Antwort ist Korrekt - der Code innerhalb von 'SysUtils.DeleteFile()' wird in die aufrufende Firma gebracht de, und es erfordert einen Verweis auf die "Windows" -Einheit, um die API-Aufrufe zu erfüllen, sonst könnte das Inlining nicht kompiliert werden. –