AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Korrekturvorschlag: DoFileWork()

Ein Thema von blackdrake · begonnen am 25. Apr 2009 · letzter Beitrag vom 26. Apr 2009
Antwort Antwort
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Korrekturvorschlag: DoFileWork()

  Alt 25. Apr 2009, 01:04
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
Daniel Marschall
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Korrekturvorschlag: DoFileWork()

  Alt 25. Apr 2009, 01:10
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).
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Korrekturvorschlag: DoFileWork()

  Alt 25. Apr 2009, 01:28
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.
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Korrekturvorschlag: DoFileWork()

  Alt 25. Apr 2009, 10:19
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Korrekturvorschlag: DoFileWork()

  Alt 26. Apr 2009, 11:52
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.
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 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