AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus
Thema durchsuchen
Ansicht
Themen-Optionen

Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

Ein Thema von wbdelpprax · begonnen am 1. Jul 2010 · letzter Beitrag vom 3. Jul 2010
Antwort Antwort
Benutzerbild von wbdelpprax
wbdelpprax

Registriert seit: 11. Mär 2008
36 Beiträge
 
#1

Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

  Alt 1. Jul 2010, 09:18
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

  Alt 1. Jul 2010, 09:40
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
Heiko

Geändert von hoika ( 1. Jul 2010 um 10:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

  Alt 1. Jul 2010, 10:58
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

  Alt 1. Jul 2010, 12:34
und relativen Pfadangaben.
SHFileOperation sollte sowieso nur mit absoluten Pfadangaben verwendet werden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von wbdelpprax
wbdelpprax

Registriert seit: 11. Mär 2008
36 Beiträge
 
#5

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

  Alt 1. Jul 2010, 23:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

  Alt 2. Jul 2010, 07:32
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von wbdelpprax
wbdelpprax

Registriert seit: 11. Mär 2008
36 Beiträge
 
#7

AW: Loeschen in den Papierkorb funktioniert nicht aus Delphi heraus

  Alt 3. Jul 2010, 04:58
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!

Geändert von wbdelpprax ( 3. Jul 2010 um 07:33 Uhr)
  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 05:32 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