Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus (https://www.delphipraxis.net/152665-loeschen-den-papierkorb-funktioniert-nicht-aus-delphi-heraus.html)

wbdelpprax 1. Jul 2010 09:18

Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
 
Hallo Leute,
mal eine Frage:
Ich arbeite mit Turbo Delphi 2006 und habe da ein merkwürdiges Problem. Ich lösche in meiner Anwendung eine Datei in den Windows Papierkorb (Win XP SP2). Wenn ich mein Programm innerhalb der Entwicklungsumgebung starte, dann werden die Dateien, die gelöscht werden sollen nicht in den Papierkorb gelöscht. Starte ich dagegen das Programm von "außerhalb" (also nach dem compile und einem build) dann werden die Dateien sehr wohl in den Papierkorb gelöscht.
Kann mir einer dieses sehr merkwürdige und auch sehr irritierende Verhalten erklären?

Im Programm sieht es ungefähr so bei mir aus:

Delphi-Quellcode:

Uses ..., ShellApi, ...;

Aufruf:
procedure ...
begin
          ...
          if DeleteFileToRecycleBin(g_delname) then ...
          ...
end;

function TFyourshow.DeleteFileToRecycleBin(const AFile: string): boolean;
var
  Operation: TSHFileOpStruct;
  l_result: integer;
begin
   try
     with Operation do
     begin
       Wnd   := 0;
       wFunc := FO_DELETE;
       pFrom := PChar(AFile + #0 + #0);
       pTo := Nil;
       fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
       hNameMappings    := NIL;
       lpszProgressTitle := NIL;
     end;
     Result := SHFileOperation(Operation)=0;
   except
     Result:= false;
     exit;
   end;
end;
Vielen Dank
Andreas

hoika 1. Jul 2010 09:40

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
 
Hallo,

baue ein Minimal-Bsp., was genau eine Datei löscht
und probier aus, ob es immer noch passiert.

#Update:#
Tip 2 gelöscht, es ging um Win98.


Heiko

uligerhardt 1. Jul 2010 10:58

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
 
Zitat:

Zitat von wbdelpprax (Beitrag 1032781)
Ich arbeite mit Turbo Delphi 2006 und habe da ein merkwürdiges Problem. Ich lösche in meiner Anwendung eine Datei in den Windows Papierkorb (Win XP SP2). Wenn ich mein Programm innerhalb der Entwicklungsumgebung starte, dann werden die Dateien, die gelöscht werden sollen nicht in den Papierkorb gelöscht. Starte ich dagegen das Programm von "außerhalb" (also nach dem compile und einem build) dann werden die Dateien sehr wohl in den Papierkorb gelöscht.

Klingt so, als hättest du ein Problem mit dem aktuellen Arbeitsverzeichnis und relativen Pfadangaben. Schau dir doch mal den übergebenen Dateinamen zur Laufzeit an.

Uli.

himitsu 1. Jul 2010 12:34

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
 
Zitat:

Zitat von uligerhardt (Beitrag 1032796)
und relativen Pfadangaben.

SHFileOperation sollte sowieso nur mit absoluten Pfadangaben verwendet werden.

wbdelpprax 1. Jul 2010 23:35

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
 
Hallo Leute,
Danke fuer die Vorschläge.
Folgendes dazu:
- Die in
Code:
if DeleteFileToRecycleBin(g_delname) then ...
übergebene Datei wurde aus einer ListBox ausgelesen, in die der User Bilddateien per OpenDialog zur Anzeige eingelesen hat. Alle Dateien liegen mit absoluten Pfadangaben vor. Im Debugging habe ich sehen können, dass die Datei, die gelöscht werden soll, mit absolut korrekter Pfadangabe in die Variable "g_delname" (g = global) übergeben wird. Daran kann es also nicht liegen.

himitsu 2. Jul 2010 07:32

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
 
und was passiert bei Folgendem?

* try-except, welche nix machen und einfach nur die Fehlermeldung zerstören sind eine schlechte Angewohnheit

* das in deinem Code sinnlos rumliegende l_result hab ich mal verwendet
(hatte dich da denn nicht der Compiler auf was hingewiesen? )

* und vorallem wird jetzt mal das Funktionsergebnis besser ausgewertet
(Ja+FehlerUndVorallemWelcher ist doch wohl besser als nur ein Ja+Nein)


Delphi-Quellcode:
procedure TFyourshow.DeleteFileToRecycleBin(const AFile: string);
var
  Operation: TSHFileOpStruct;
  l_result: integer;
begin
  with Operation do
  begin
    Wnd := 0;
    wFunc := FO_DELETE;
    pFrom := PChar(AFile + #0);
    pTo := Nil;
    fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
    hNameMappings := NIL;
    lpszProgressTitle := NIL;
  end;
  l_result := SHFileOperation(Operation);
  if l_result <> 0 then
    Raise Exception.Create(SysErrorMessage(l_result));
end;

wbdelpprax 3. Jul 2010 04:58

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
 
Hallo himitsu,
erstmal ganz herzlichen Dank, das Du Dir so viel Mühe mit meinem Thema gegeben hast.

Das Programm ist echt noch in einem Betastadium, deswegen sind auch noch nicht alle Programmieraufgaben vollständig und korrekt erledigt. Natürlich hast Du recht mit den Try-Block und ich werde mich auch bemühen, dass zum Schluss alles so ist, wie es sein soll.

Ich wollte nicht die gesamte Unit posten, da das doch ein wenig zu umfangreich wäre. Und es geht mir ja wie gesagt auch nur um dieses merkwürdige Löschverhalten.

In einem solchem Probierstadium kommt es bei mir auch immer wieder vor, das z. B. Variablen benutzt und wieder verworfen wurden, die dann aber immer noch in der Deklaration herumlungern. Auch das wird natürlich in der Endfassung beseitigt sein.

Das der Compiler nicht über die Variable l_result gemeckert hat ist doch aber klar: Für den war das nur eine ungenutzte Variable, die aber keinen Schaden anrichtet. Und die Funktion hat ja selber eine Result-Variable, die nicht extra deklariert werden muss. Mein Fehler war es natürlich, nicht diese interne Result-Variable zu nutzen und auf den Fehler abzufragen. Wenn man das Programm nicht nur kompiliert sondern auch noch ein Build macht, dann gibt es allerdings schon einen Hinweis auf eine ungenutzte Variable. Aber das nur nebenbei, denn das ist ja nicht mein Problem und wird wie gesagt in der Endfassung bereinigt.

Das hast Du sehr viel besser gelöst und vom Ablauf her ist jetzt einiges klarer.

Nur habe ich leider immer noch das Problem mit dem unterschiedlichem Löschen:
- Zur Laufzeit aus Delphi heraus eben nicht in den Papierkorb
- Mit ausführbarer Exe-Datei wie gewollt in den Papierkorb

Das Result der Funktion SHFileOperation bringt beim debuggen den Integer-Wert 0 und erzeugt daher keine Fehlermeldung.

Eigentlich könnte ich ja alles so lassen, denn im Endeffekt passiert ja genau das, was ich will. Aber ich finde eine solche Situation doch äußerst unbefriedigend und außerdem stört es auch beim Testen aus Delphi heraus.

Also verstehen kann ich das immer noch nicht. Vielleicht kannst ja Du oder irgendwer doch noch dazu beitragen meine Verwirrung aufzulösen.

Vielen Dank und Gruß Andreas!


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