![]() |
Problem beim Ausschneiden/Einfügen per STRG+X/V
Moin,
auch ich hab nach längerem mal wieder eine Frage :wink: Und zwar steh ich vor einem Problem, auf dessen Lösung ich nach längerem Suchen immer noch nicht gestoßen bin: Ich kopiere aus meinem Programm einige Dateien mit STRG+C oder möchte sie mit STRG+X ausschneiden - soweit so gut, das funktioniert auch alles (HDROP, Clipboard etc) - allerdings weiß ich nicht wie ich das handhaben soll das die Dateien wirklich ausgeschnitten werden, wenn sie woanders wieder eingefügt wurden?!? Kleines Beispiel: Wenn ich bei mir im Programm STRG+X mache und dann bei mir im Programm, oder auch im Explorer STRG+V drücke, dann werden die Dateien zwar korrekt kopiert - allerdings sind die Alten immer noch vorhanden. Genau das gleiche tritt natürlich auch umgekehrt auf - wenn ich im Explorer Dateien mit STRG+X ausschneide und bei mir im Programm mit STRG+V einfügen will, geht das zwar - allerdings bleiben die Dateien am ursprünglichen Ort ebenfalls bestehen... Ich hoff mal das Problem ist klar, ich müsste halt wohl irgendwie abfragen ob die Dateien nun grade nur kopiert oder ausgeschnitten werden sollen, bzw. es beim Einfügen in die Zwischenablage selbst festlegen?!? MfG und herzlichen Dank, Benedikt |
Re: Problem beim Ausschneiden/Einfügen per STRG+X/V
Wenn du bereits mit der IDataObject-Schnittstelle arbeitest, dann hast du wohl nur vergessen, dass du die Methode SetData benutzen kannst um dem Source-Object mitzuteilen, dass die Drop- resp. Paste-Operation erfolgreich war.
Wenn nicht kannst du ![]() Grüße vom marabu |
Re: Problem beim Ausschneiden/Einfügen per STRG+X/V
Hi,
momentan benutze ich folgende beide Methoden:
Delphi-Quellcode:
procedure ClipBoardGetFiles(AList: TStringList);
var F: THandle; Buffer: Array [0..MAX_PATH] of Char; i: Integer; NumFiles: Integer; begin if (not (Clipboard.HasFormat(CF_HDROP))) then Exit; Clipboard.Open; try F:=Clipboard.GetAsHandle(CF_HDROP); if (F<>0) then begin NumFiles:=DragQueryFile(F, $FFFFFFFF, nil, 0); AList.Clear; for i:=0 to NumFiles-1 do begin Buffer[0]:=#0; DragQueryFile(F, i, Buffer, SizeOf(Buffer)); AList.Add(Buffer); end; end; finally Clipboard.Close; end; end;
Delphi-Quellcode:
procedure ClipBoardSetFiles(AList: TStringList);
var AFileList: String; ADropFiles: PDropFiles; AGlobal: THandle; ALength: Integer; i: Integer; begin AFileList:=''; for i:=0 to AList.Count-1 do begin AFileList:=AList[i]+#0+AFileList; end; ALength:=Length(AFileList)+1; AFileList:=AFileList+#0; AGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDropFiles)+ALength); if (AGlobal=0) then raise Exception.Create('Could not allocate memory.'); begin ADropFiles := GlobalLock(AGlobal); ADropFiles^.pFiles := SizeOf(TDropFiles); Move(AFileList[1], (PChar(ADropFiles)+SizeOf(TDropFiles))^, ALength); GlobalUnlock(AGlobal); Clipboard.SetAsHandle(CF_HDROP, AGlobal); end; end; Ist das damit nicht möglich? Wenn dann muss ich mich wohl mal mit dem von dir angesprochenen IDataObject etc. auseinandersetzen (gibts da denn nirgendwo ein Beispiel für? Schneidet denn keiner Dateien aus :mrgreen: ) |
Re: Problem beim Ausschneiden/Einfügen per STRG+X/V
Deine gezeigten Routinen lesen und schreiben das ClipBoard-Format CF_HDROP. An anderer Stelle wirst du dein Formular als DropTarget registriert haben und die Drag&Drop-Events verarbeiten. Oder wie erfährst du von den Drop-Versuchen aus dem Shell-Namensraum?
Übrigens: Obwohl ich die VirtualShellTools noch nicht verwendet habe vermute ich, dass du dort jede Menge Delphi-Code studieren kannst, der sich mit dieser Problematik auseinander setzt. Grüße vom marabu |
Re: Problem beim Ausschneiden/Einfügen per STRG+X/V
Ich benutze meine Methoden im Moment einfach in einer ListView wobei ich STRG+V/X/C abfange und dann die entsprechenden Methoden aufrufe.
Das heißt bei STRG+V arbeite ich mit der GetFiles und bei STRG+X/C mit SetFiles und kopiere dann mit den Shell-Funktionen die Dateien. Nur wie gesagt war mein Problem dann, das ich nicht weiß ob die Dateien ausgeschnitten oder kopiert werden sollen... Aber ich glaub ich schau mir da mal die VirtualShellTools oder anderes an - is ja irgendwie ne merkwürdige Sache das Ganze. |
Re: Problem beim Ausschneiden/Einfügen per STRG+X/V
Hallo,
ich krame mal dieses alte Thema heraus... Hat jemand eine Lösung, um herauszufinden, ob im Explorer nun Ctrl+C oder Ctrl+X gedrückt wurde? Ich benutze in etwa obigen Code. Funktioniert super beim Einfügen, wenn vorher kopiert wurde. Wenn vorher ausgeschnitten wurde, kommt manchmal gar nichts an, manchmal ne AV, usw... Auf jeden Fall bleiben die Ausgangsdateien stehen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz