Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Korrekturvorschlag: DoFileWork() (https://www.delphipraxis.net/133082-korrekturvorschlag-dofilework.html)

blackdrake 25. Apr 2009 01:04


Korrekturvorschlag: DoFileWork()
 
Hallo.

Ich habe eigentlich keinen neuen Artikel, dafür wollte ich einen alten Artikel verbessern bzw. kommentieren (was ja so ohne weiteres nicht möglich ist). Ich hatte den Autor sakura im Oktober 2008 deswegen angefragt, doch die Nachricht ist bis zum heutigen Tage ungeöffnet, trotz Nutzeraktivität...

Folgende Funktion führt eine Operation bei einer Datei durch:

http://www.delphipraxis.net/internal...?p=68850#68850

Mir ist aufgefallen, dass PAnsiChar, AnsiString sowie SHFileOperationA() verwendet wurde. Für was? Ich erachte es für besser, wenn direkt die Delphi-Standardtypen PChar, String und der Alias SHFileOperation() verwendet werden. Dann ist die Anwendung auch direkt Unicode-Fähig, wenn auf D2009 umgestiegen wird.

Das wäre also mein Korrekturvorschlag:

Delphi-Quellcode:
// [url]http://www.delphipraxis.net/post68850.html[/url]
// Unicode-Compatible for future Delphi versions [blackdrake]
function DoFileWork(aOperation: FILEOP_FLAGS; aFrom, aTo: String;
    Flags: FILEOP_FLAGS): Integer;
var
  FromPath, ToPath: String;
  SHFileOpStruct: TSHFileOpStruct;
begin
  FromPath := aFrom + #0#0; // ToDo? Ist #0#0 im Falle von WideStrings dann #0#0#0#0? 
  ToPath := aTo + #0#0;
  with SHFileOpStruct do
  begin
    Wnd := 0;
    wFunc := aOperation;
    pFrom := PChar(FromPath);
    if ToPath <> '' then
    begin
      pTo := PChar(ToPath)
    end
    else
    begin
      pTo := nil;
    end;
    fFlags := Flags;
  end;
  Result := SHFileOperation(SHFileOpStruct);
end;
Meinen Korrekturvorschlag muss ich leider noch mit einer Frage verbinden, die auch oben einkommentiert ist. Muss das terminierende #0#0 (wieso 2 Mal bei AnsiStrings?) beim Wandel zu WideStrings in #0#0#0#0 gewandelt werden? Wenn ja, dann sollte hier noch eine Bedingung eingeführt werden, die unterscheidet zwischen String==AnsiString (D2007) und String==WideString (D2009+).

Gruß
blackdrake

Dax 25. Apr 2009 01:10

Re: Korrekturvorschlag: DoFileWork()
 
Strings (allermindestens Ansistrings) sind in Delphi immer schon Nullterminiert, sonst würde jeder API-Aufruf, der die Adresse des ersten Zeichens eines String bekommt, nicht funktionieren (und davon gibt's einige).

blackdrake 25. Apr 2009 01:28

Re: Korrekturvorschlag: DoFileWork()
 
Achso, dann braucht man das +#0#0 bzw. ein +#0#0#0#0 überhaupt nicht? Das klingt mir im Nachhinein logisch, da ich ja bei WinAPI-Aufrufen auch immer <Funktion>(PChar(<String>)) schreibe, ohne darüber nachzudenken, ob String ein Unicodestring mit #0 werden kann.

Flocke 25. Apr 2009 10:19

Re: Korrekturvorschlag: DoFileWork()
 
Ein +#0 braucht man auf jeden Fall, da die Routine auch mit mehreren Dateinamen umgehen kann und das Ende an einem Leerstring erkennt (MSDN-Library durchsuchenSHFILEOPSTRUCT). Zwei +#0#0 sind ggf. für ältere Delphi-Versionen nötig.

Bei einem WideString ist #0 auch zwei Byte lang, so dass hier ebenfalls #0#0 reichen würde und du sie nicht verdoppeln musst.

blackdrake 26. Apr 2009 11:52

Re: Korrekturvorschlag: DoFileWork()
 
Zitat:

Zitat von Flocke
Bei einem WideString ist #0 auch zwei Byte lang, so dass hier ebenfalls #0#0 reichen würde und du sie nicht verdoppeln musst.

Alles klar, das ist es, was ich wissen wollte. Also ist der oben genannte Code korrekt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 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