Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste" (https://www.delphipraxis.net/199196-meldung-inline-funktion-xzy-nicht-expandiert-weil-unit-abc-nicht-uses-liste.html)

Harry Stahl 5. Jan 2019 12:11


Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Habe in einer FMX-Anwendung den Aufruf "RenameFile (OldName, NewName)" drin.

Der Compiler gibt den Hinweis aus: "[dcc32 Hinweis] Fnewmail.pas(3575): H2443 Inline-Funktion 'RenameFile' wurde nicht expandiert, weil Unit 'Winapi.Windows' in der USES-Liste nicht angegeben ist"

Verstehe nicht, was das soll.

Selbst wenn ich den Aufruf erweitere auf "System.sysUtils.renameFile (OldName, NewName);", um klar zu stellen, dass ich keinen Bezug zur Winapi haben möchte, kommt denno der Hinweis.

Wieso nur?

Und warum Winapi.windows in eine FMX-Anwendung hinzunehmen?

Macht für mich keinen Sinn.

Hat jemand eine Erklärung? Und was soll das "expandieren" eigentlich bedeuten?

Rollo62 5. Jan 2019 13:13

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Hallo Harry,

das kommt wohl daher das RenameFile inline deklariert ist,
und unter Windows

Delphi-Quellcode:
function RenameFile(const OldName, NewName: string): Boolean;
{$IFDEF MSWINDOWS}
begin
  Result := MoveFile(PChar(OldName), PChar(NewName));
end;
{$ENDIF MSWINDOWS}

auf eine WinApi Fkt. zugreift.
Ich würde die Meldung mal einfach ignorieren, oder besser
  1. die Warning an dieser Stelle abschalten,
    Zitat:

    {$WARN _name_of_warning_ OFF|ON|ERROR}
    oder
  2. noch einen eigenen Wrapper drumschreiben der dann dieses Warning immer abschaltet.

Edit:
Sehe gerade das es ein Hint und kein Warning ist, dann geht es wohl nur so abzuschalten
Delphi-Quellcode:
{$HINTS OFF}  // <-- muss um die aufrufende Fkt drumrum
procedure TForm1.Caller;
begin
    RenameFile('a.text', 'b.text');
end;
{$HINTS ON}
Rollo

Harry Stahl 5. Jan 2019 13:47

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Das blöde daran war, dass der Aufruf von Renamefile in einer eigenen Funktion innerhalb einer Prozedur steckt. Da reicht es wohl nicht, die Funktion mit den Hints Off / Hints On Schaltern zu umschließen, sondern man muss dann die ganze Prozedur umschließen.

Aber ich habe jetzt noch einen Weg gefunden, der ohne die Meldung auskommt:

System.ioutils.TFile.Move(Oldname, ASaveFileName);

Da wird unter Windows am Ende zwar auch die gleiche Funktion aus der Winapi genommen, aber wenigstens unterbleibt die überflüssige Meldung.

Uwe Raabe 5. Jan 2019 15:35

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Zitat:

Zitat von Harry Stahl (Beitrag 1422672)
System.ioutils.TFile.Move(Oldname, ASaveFileName);

Da wird unter Windows am Ende zwar auch die gleiche Funktion aus der Winapi genommen, aber wenigstens unterbleibt die überflüssige Meldung.

... weil der Compiler diesen Aufruf nicht mehr zu Gesicht bekommt. Für Plattform-übergreifende Entwicklung sind ja eben genau die IOUtils gemacht.

Harry Stahl 5. Jan 2019 15:45

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Wobei nach meinem Verständnis eigentlich alle System.XXX (außer natürlich System.Win.XXX spezifische units) Plattform-neutral sein sollten.

Z.B. System.Threading, etc. nutze ich ja unter allen Plattformen, hätte man bei "System.sysUtils" eigentlich insofern auch erwarten können, dass die vollständig neutral ist und nicht bei einer spezifischen Funktion meckert, dass eine Winapi nicht eingebunden wäre...

Uwe Raabe 5. Jan 2019 16:00

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Ich hätte eher erwartet, daß für SysUtils.RenameFile so was wie "deprecated - use System.IOUtils.TFile.Move" kommt.

Aber: Das Inline hat für VCL-Entwickler immerhin noch einen kleinen Performance-Vorteil. Den müsste man für die FMX-Entwickler aufgeben. Andererseits können die aber ja auch gleich TFile.Move benutzen und alle sind zufrieden. Nicht in allen Fällen gibt es diesen Ausweg.

Harry Stahl 5. Jan 2019 16:04

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1422683)
Ich hätte eher erwartet, daß für SysUtils.RenameFile so was wie "deprecated - use System.IOUtils.TFile.Move" kommt.

Genau das wäre auch meine Erwartung gewesen... Na ja, sei es drum, Problem ist ja behoben...

Uwe Raabe 5. Jan 2019 16:13

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Zitat:

Zitat von Harry Stahl (Beitrag 1422684)
Genau das wäre auch meine Erwartung gewesen...

Mit dem "Aber" in meinem Post wollte ich eigentlich verdeutlichen, daß es durchaus sinnvoll sein kann, diese Funktion direkt zu verwenden, die Warnung zu beherzigen und die Winapi aufzunehmen. Wenn man tatsächlich nicht rein für Windows (VCL) entwickelt, kann man das ja immer noch durch ein IFDEF lösen. Ist halt umständlicher als TFile.Move zu verwenden, aber schneller (unter Windows). Deswegen hat sowohl das inline als auch die Warnung ihre Berechtigung.

DP-Maintenance 5. Jan 2019 16:27

Dieses Thema wurde am "05. Jan 2019, 17:27 Uhr" von "Luckie" aus dem Forum "Sonstige Fragen zu Delphi" in das Forum "Object-Pascal / Delphi-Language" verschoben.

freimatz 7. Jan 2019 07:14

AW: Meldung "Inline-Funktion XZY nicht expandiert, weil Unit ABC nicht in uses Liste"
 
Ich denke nicht, dass der Geschwindigkeitsvorteil von inline bei Dateisystemoperationen eine Rolle spielt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz